Sonntag, 14. November 2010

CLI - Spaß auf der Kommandozeile

Ob man tatsächlich Spaß auf der Kommandozeile haben kann sei einmal dahingestellt.
Während unter Linux viele Werkzeuge und Hilfen zur Verfügung stehen, sind unter Windows die notwendigen Tools zum Arbeiten auf der Kommandozeile eher dünn gesät. Batchdateien und VBScript sind in die Jahre gekommen, die Powershell schreckt nicht-Administratoren ob ihrer Andersartigkeit doch etwas ab. Was bleibt? Der Klassiker Perl?
Warum nicht PHP das seine Wurzeln in Perl hat?

PHP ist stabil. Man hat bereits das notwendige Know-How und viele fertige Skripte.
Und mit dem Command Line Interface (CLI) eine ausgereifte Möglichkeit PHP für Administrationsaufgaben jenseits eines Webservers einzusetzen. PHP kann zudem ohne Installation verwendet werden: Gerade auf produktiven Servern wird eine Installation von der zuständigen EDV-Abteilungen nicht gerne gesehen.

Installation

Wenn nicht bereits eine PHP-Installation vorliegt, genügt es eine aktuelle, gezippte Version von php.net herunterzuladen und zu entpacken.
Natürlich kann man auch eine Installation mit einem Setup vornehmen lassen, notwendig ist dies aber nicht. Ein kleiner Tipp vielleicht: Nie gutgemeint alle Installationsoptionen aktivieren, es sei denn man weiß wirklich was man da tut.

Nach dem Entpacken sollte eine der beiden Dateien “php.ini-development” oder “php.ini-production” in “php.ini” umbenannt werden. Aber nur mit der “php.ini-development” kommt man auch in den Genuss wirklich jede Fehlermeldung und Warnung zu sehen.
Fertig!

Aufruf

Der Aufruf von PHP erfolgt über die Kommandozeile* in der Form “d:/php/php” oder für Puristen auch gerne “d:\php\php.exe”, optional mit Parametern und der Angabe einer zu startenden Datei.

Ist PHP im “path” eingetragen, kann man sich etwas Tipparbeit sparen.
Praktischerweise kann der Aufruf in dieser Form genauso über Batch-Dateien oder den Scheduler erfolgen.
*(Auch als "Eingabeaufforderung" bekannt. Fast besser zu finden über die Startleiste, "Ausführen", Öffnen: "cmd")

Parameter

Die php.exe kennt einige Parameter, hier die vielleicht wichtigsten:
“-v” gibt die Versionsnummer aus, “-i” ist das das Gegenstück zu phpinfo() und “-l datei.php” testet den Syntax einer angegebenen Datei. Mit dem Parameter “-c” kann eine alternative php.ini angegeben werden, mit “-n” wird auf die Verwendung derselben verzichtet.

Mit dem Parameter “-s datei.php” hat man einen praktischen Syntax-Highlighter zur Verfügung, der den Code farbig als HTML generiert (siehe Beispielgrafik einer so erzeugten Datei).

Mit “ > c:/datei” kann man sich die Fähigkeiten der Kommandozeile zu nutze machen und die Ausgabe in eine Datei umleiten, mit “>> c:/datei” anhängen. So kann man sich das von “-s” generierte HTML speichern oder sich sogar eine Logfunktion im Script selbst sparen.
Das ganze funktioniert übrigens auch beim Aufruf aus einer Batchdatei.

Die PHP-Dateien

HTML sollte aus den PHP-Dateien entfernt werden, da es unnötig in den Ausgabestrom geschickt wird, aber keine Funktion mehr hat. Der Code selbst muss nach wie vor mit dem Tag "?..?", bzw. besser mit "?php...?" als solcher gekennzeichnet sein, andernfalls muss der Aufruf mit dem Parameter “-r” erfolgen.
("?...?" führt vereinzelt auf einigen Systemen zu einem Fehler beim Aufruf.)

Die Ausgaben von Befehlen wie “echo” oder “print_r” werden in den Ausgabestrom der Kommandozeile geschrieben. Wichtig ist, dass Pfadangaben, auch die von inkludierten PHP-Dateien überprüft und gegebenenfalls angepasst werden.
Danach steht der Ausführung von PHP-Scripten nichts mehr im Weg. Nicht einmal mehr die Zeit ist ein kritischer Faktor, da es im CLI standardmäßig keinen Time-Out mehr gibt, die “max_execution_time” ist auf 0, endlos gesetzt.

Die Übergabe von Parametern kann nicht mehr in der Form “datei.php?i=1” erfolgen, da eine so benannte Datei gesucht würde. Parameter müssen durch Leerzeichen getrennt werden um von PHP als solche erkannt zu werden.
Mit der Variablen “argc” und dem Array “argv” stehen jedem Script die Anzahl der übergebenen Parameter und die Parameter selbst zur Verfügung. Entweder liest man sie direkt aus oder baut sich ein einfaches Konstrukt das Parameter in einer Form "Schlüssel=Wert" verabeiten kann. Der erste Parameter ist übrigens immer der an PHP übergebene Dateiname.
echo $argc;
print_r($argv);

//Auslesen der Parameter mit '='
for($i=1; $i<$argc; $i++)
{
 $Argument = explode('=', $argv[$i]);
 echo $Argument[0] . ' -> ' . $Argument[1] . "\n";
}
Externe Programme oder sogar andere PHP-Scripte können über “exec()” oder “system()” gestartet werden, das Script wartet jeweils auf deren Beendigung.
exec('notepad.exe');
exec('d:/php/php.exe d:/toast.php >d:/log.txt');

Fertig!

Es bleibt vielleicht bei dem einen oder anderen die berechtigte Frage, warum man auf den Komfort eines Webserver verzichten soll?

Webserver benötigen Ressourcen und bedeuten für klassische Administrationsaufgaben einen möglicherweise unnötigen Overhead. Es soll ja sogar Computer geben auf denen kein Webserver installiert ist und auch gar nicht installiert werden darf. Viele administrative Aufgaben benötigen keine Oberfläche, keine Interaktion und laufen automatisiert ab.

Wer große Datenpakete zwischen verschiedenen Systemen hin- und herschieben muss, diese aus Datenbanken oder XML lesen, aufbereiten, transformieren und packen muss, der wird eher den Bedarf haben solche administrativen Tätigkeiten schlank und automatisiert über die Kommandozeile zu auszuführen - des Nachts in einer gesicherten Umgebung, wenn die Prozessoren im Leerlauf gelangweilt auf bessere Zeiten warten.

Keine Kommentare:

Kommentar veröffentlichen