Facebook
Twitter
Google+
Kommentare
11

PHP und die Kommandozeile – Usereingaben

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.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

11 Comments

  1. 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“;

    Reply
  2. 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

    Reply
  3. 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.)

    Reply
  4. 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!

    Reply
  5. 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

    Reply
  6. 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)

    Reply
  7. @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).

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen