• PHP und die Kommandozeile – Usereingaben

    von am 24. Juni 2009

    Da ich zur Zeit sehr viel mit PHPUnit und anderen PHP Tools hantieren und diese sich nur über die Kommandozeile bedienen lasse, habe ich erst gemerkt, wie interessant dieses Feature doch ist. PHP ist also nicht nur gut zum erstellen von Webseiten, sondern auch dazu da Konsolenprogramme zu schreiben, die einem die täglichen Aufgaben erleichtern.

    In der Vergangenheit haben wir ja bereits Tools, wie phploc, PHPUnit, pDepend oder PEAR angesprochen. All diese Helferlein sind in PHP geschrieben und lassen sich in der Kommandozeile wunderbar nutzen. Dabei gibt es kaum etwas zu beachten, denn die Unterschiede zwischen CLI und Webserver Ansteuerung sind nur marginal. Auf einen kleinen Unterschied möchte ich aber heute trotzdem eingehen. Verwende ich PHP auf dem herkömmliche Wege als Skriptsprache, angesteuert von meinem Webserver, so habe ich einen relativ geradlinigen Weg durch mein Skript. Alle User-Parameter, die das Skript beeinträchtigen können, werden bereits am Anfang des Durchlaufs gesetzt und können danach auch nicht mehr durch den User verändert werden. Anders ist es aber auf der Kommandozeile. Hier können nach dem Start des Skriptes noch vom Benutzer Parameter abgefragt werden, was eine Interaktion mit dem Anwender ermöglicht. Falls man also nicht alles über Kommandozeilen Parameter lösen will, was meiner Meinung nach nicht immer die beste Alternative ist, der kann sich ein Skript wie das folgende basteln:

    <?php
      $handle = fopen("php://stdin","r");
      echo "Wie lautet dein Name? ";
      $name = fgets($handle, 255);
      echo "Hallo $name \n";
    ?>

    Wenn man das so liest, dann wird einem schnell klar was es macht. Ist ja kein Hexenwerk so einen einfachen Stream zu verwenden. Ich denke nur, dass viele nicht wussten, dass man die Kommandozeile auch als Stream öffnen kann und somit Strings einlesen kann. Ich finde es eigentlich eine ganz schicke Geschichte, auch wenn ich es selbst leider noch nie genutzt habe.

    Das Tool um PEAR Pakete zu erstellen arbeitet auf diese Art und ich kann nur sagen, dass es wirklich ein sehr komfortables Programm ist. Bei einer solchen großen Anzahl von möglichen Parametern, kann man es auch nicht mehr über die herkömmliche Weise lösen, denke ich.

    Also wie gesagt, ich habe die Kommandozeile in den letzten Tagen neu für mich entdeckt und denke, dass ich noch ein paar Tipps in den nächsten Wochen parat haben werde.

    Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    11 Kommentare »


    • Udo
      am 24. Juni 2009 um 08:14 Uhr

      In CLI Anwendungen (ab PHP 4.3 mein ich) sollten die 3 Konstanten STDIN, STDOUT and STDERR automatisch verfügbar sein, sodass man sich die definition des handles sparen kann:

      echo ‘Wie lautet Dein Name? ‘;
      $name = trim(fgets(STDIN));
      echo “Hallo $name \n”;


    • Nils Langner
      am 24. Juni 2009 um 09:23 Uhr

      @Udo: Das klingt natürlich noch besser. Danke!


    • Peter Hansen
      am 24. Juni 2009 um 09:59 Uhr

      Moin Nils,

      allerdings gibts auch irgendwie Grenzen bei der Sache mit PHP die es in anderen Sprachen so nicht gibt. Ich habe z.B. mal versucht ein CLI-Tool mit User/Pass Authentifizierung zu schreiben. Leider kann das Passwort währned der Eingabe nicht durch Sternchen ersetzt werden oder man schreibt (Unix-üblich) ins Leere. Hast du vielleicht einen Tipp auf Lager wie sowas funktionieren kann?

      lg, peter


    • Dennis Becker
      am 24. Juni 2009 um 10:00 Uhr

      Hui, das erinnert mich dann aber stark an meine Schulzeit und die ganzen C/C++ Programme auf Konsolenbasis ;) Allerdings würd ich es eher grausam finden, nochmals komplette Menü-Strukturen nur mit Texten aufzubauen, aber jedem das seine :)

      Mich würd mal nen Beispiel sehen, wo sich PHP als CLI Anwendung wirklich gut eignet (abgesehen von PEAR etc.)


    • Nils Langner
      am 24. Juni 2009 um 10:39 Uhr

      @Dennis: Was meinst du denn mit PEAR etc.? Ich finde PHPUnit, phploc, pdepend sind doch schon genügend Tools, die als CLI Anwendung echt gut sind.


    • Dennis Becker
      am 24. Juni 2009 um 11:04 Uhr

      Joa, ich meine etwas, was mal ne ganz andere Aufgabe hat. Mir fällt da sonst eigentlich nur nen CronJob / Worker ein, der aber unabhängig vom Benutzer läuft und definierte Aufgaben abarbeitet, zum Beispiel aus einer Message Queue. Sonst fällt mir keine sinnvolle Verwendung ein :)

      PS: This webpage is not available. Kriege ich recht häufig heute – falls nicht, ist die Seite sehr langsam!


    • mbischof
      am 24. Juni 2009 um 14:55 Uhr

      Die meisten Frameworks wie symfony, cake, yii, zend arbeiten mit Kommandozeile. ich würde also auch auf kommandozeilenebene nie ganz bei null anfangen wollen
      Sinnvolle Anwendungen dafür sind Quelltextgeneratoren, Verzeichnisstrukturgeneratoren, Mailversand, Cachegeneratoren usw, oder aber auch einfache Dinge wie schnell mal einen user anlegen zum Bleistift


    • Johannes
      am 24. Juni 2009 um 17:36 Uhr

      Statt php://stdin zu nuzen kann man auch auf das berets geöffnete STDIN zurück geifen ;-)

      In der PHP Doku lohnt sich ansonste das “PHP on the Command line” Kpaitel in der “Features” Rubrik. (hoffe, dass das noch dort einsortiert ist, nicht geprüft)


    • Toby
      am 24. Juni 2009 um 23:14 Uhr

      eZ Components bieten da ein recht einfaches aber praktisches Dialog-Framework an: http://ezcomponents.org/docs/api/latest/introduction_ConsoleTools.html#interacting-with-the-user. So als kleiner Tipp nebenbei. ;)


    • rbq
      am 25. Juni 2009 um 00:10 Uhr

      @Dennis: Zur Petition gegen Internetsperren brauchte ich zum Beispiel einen Twitter-Bot, der einige Wochen laufen und regelmäßig den Stand durchgeben konnte (@Mitzeichner). PHP beherrsche ich gerade zufällig, also habe ich es benutzt: Die cURL-Extension zum Abruf der Seite, RegEx zum Parsen, wiederum cURL zum Twittern. Das PEAR-Package System_Daemon macht daraus einen Daemon inkl. Startskripten für Debian/Ubuntu, die Daten schreibt SQLite weg.

      Auch für anderen Kleinkram benutze ich PHP-Skripte, vermutlich sogar zu oft (Bash täte es da auch).


    • LimeSpace – IT » Die Links der Woche, zum letzten im Juni
      am 27. Juni 2009 um 08:13 Uhr

      [...] von PHP auf der Kommandozeile vom PHPHatesMe Blog [...]

    RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

    Hinterlasse einen Kommentar

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.