Update April 2023
Der erste Beitrag beschäftigt sich mit der Anwendung von PHP auf der Kommandozeile.
Natürlich liegt die Hauptanwendung von PHP in serverseitigen Web-Applikationen.
Aber Tests, Ausprobieren neugeschriebener Funktionen u.ä. erledigt sich auf
der Kommandozeile schnell, effizient und beeinflusst nicht anderen Code.
Ein Werkzeug, auf das man nicht verzichten sollte.
Über das Untermenü gelangt man zu verschiedenen Beiträgen, die eher zur Hauptanwendung von PHP gehören.
Was uns PHP über sich selbst verrät
PHP kann man auf aufrufen mit dem Kommando
php
, einfach, einleuchtend und gut zu merken. Uns interessiert vielleicht erst einmal
die Version.
php -v # Ausgabe von Version, Einsatzumgebung, Built-Zeitpunkt, Hersteller
Dagegen verrät uns
php -V # Online-Hilfe
(Großbuchstabe!) die Syntax des Kommandos
php
und erklärt uns die Bedeutung der Optionen.
Natürlich, wer PHP erst kennenlernen möchte, dem hilft wohl zuerst
das PHP-Handbuch weiter, das online und in verschiedenen Sprachen
verfügbar ist.
Konfiguration
Fortgeschrittene Programmierer brauchen manchmal mit
php -ini # aktuelle Konfigurationsdaten
die Einstellungen der Konfiguration von PHP.
Eine Übersicht über die ganz Programmierumgebung liefert
php -i # PHP-Einstellungen und Features
Module
PHP besteht aus mehreren Modulen, die die Anwendung von PHP
erheblich erweitern.
php -m # Vorhandene Module, Kurzfassung
Es kann sein, dass erwartete Module nicht angezeigt werden.
Sie können trotzdem vorhanden sein, nur sind sie in der
php.ini
unter
Extensions
oder
Dynamic Extensions
auskommentiert.
Einige Erweiterungen beruhen auf Bibliotheken anderer Systeme, die installiert
sein müssen, aber nicht selten von PHP mitgebracht werden.
php --ri Erweiterung # Konfiguration der Erweiterung
Zum Beispiel wird bei den Erweiterungen
xml
und
xsl
die Version der externen Bibliothek angezeigt.
Beinahe ein Handbuch
Die von PHP verwendeten Namen der Erweiterungen sind eigene Kürzel, das Kommando
php --re Erweiterung # Bibliotheksname, Funktionen
zeigt außer dem genauen Bibliotheksnamen enthaltene Konstanten und deren
Default-Belegung, sowie die Aufrufsyntax der enthaltenen Funktionen.
Aber auch äquivalente Informationen über PHP-Funktionen sind mit
php --rf Funktionsname
abrufbar sowie über vorgegebene Klassen.
php --rc Klassenname
Argumente für ein PHP-Programm
Tools auf der Kommandozeile, allen voran Shellscript, sind nach wie vor
hilfreich um das eine oder andere kleine Problem zu lösen.
Gelegentlich vermisst man das eine oder andere Feature oder muss es
umständlich mit langen Befehlsketten erwirken. Hier kann PHP ins Spiel kommen.
Es ist möglich, ein PHP-Programm zu schreiben, das wie ein Kommando hinter
dem Prompt eingetippt und ausgeführt werden kann.
Schauen wir uns an, wie das gedacht ist:
php -f mein-php-programm.php ...weitere Argumente
oder kürzer
php mein-php-programm.php ...weitere Argumente
Ein PHP-Programm ist ein Script, das interpretiert werden muss. Es muss daher
der Interpreter (das Kommando php
) aufgerufen werden
und nach der Option -f
kann das gewünschte PHP-Programm
mit weiteren Argumenten angegeben werden.
Ohne Angabe der Option funktioniert es auch, die Interpretation eines PHP-Skripts ist also voreingestellt.
Nichts ist einfacher, als einen Fehler zu machen
Fehler sind ein notwendiger Weg zur Erkenntnis, und nicht selten hat man
einfach nur ein Semikolon vergessen.
php -l mein-php-programm.php
(Kleinbuchstabe L !) hilft, Syntaxfehler zu finden. Und
php -w mein-php-programm.php
ist ein Beautifier; eine farbig unterlegte und formatierte Darstellung des Codes.
Die vordefinierte Variablen $argc und $argv
Das PHP-Script muss angegebene Argumente auch lesen können.
Dazu müssen wir etwas ausholen und ein kleines Hilfsprogramm schreiben, wir nennen es argumente.php
.
<?php
# argumente.php
print PHP_EOL."Anzahl der Argumente: $argc".PHP_EOL;
print_r($argv); # Argumente des Kommandos php
?>
Dieses kleine Programm führen wir ohne nähere Erklärungen auf der Kommandozeile aus.
C:\Users\root\PHP-Beispiele>php argumente.php
Anzahl der Argumente: 1
Array
(
[0] => argumente.php
)
Einen zweiten Aufruf erweitern wir mit weiteren Argumenten und verwenden beispielsweise die Zahlen 25 und 9.
C:\Users\root\PHP-Beispiele>php argumente.php 25 9
Anzahl der Argumente: 3
Array
(
[0] => argumente.php
[1] => 25
[2] => 9
)
Und nun lässt sich viel besser erklären, was da eigentlich passiert.
Wir sehen im Programmtext zwei Variablen, nämlich $argc
und $argv
. Diese Variablen werden von PHP mitgeliefert, sind also immer vorhanden.
Die Variable $argc
enthält die Anzahl der Argumente, die wir auf der Kommandozeile eingegeben haben.
Die Variable $argv
enthält auch einen Wert, aber einen recht komplexen, nämlich ein Array. Ein Array kann man auch nicht so ohne weiteres mit print
ausgeben, sondern nutzt die Funktion print_r()
.
Ein Array kann intern mehrere Werte enthalten, die durch Schlüsselwerte (Key Values) unterschieden werden. Das sehen wir besser im Ergebnis des zweiten Aufrufs.
Die Schlüsselwerte sind numerisch, beginnen mit Null und zählen weiter je nachdem, wie viel
Argumente wir angegeben haben. Also befinden sich die Werte aller Argumente in diesem Array.
Eigentlich hatten wir das Gefühl, wir geben im zweiten Aufruf nur zwei Argumente an nämlich die 25 und die 9. Aus Sicht unseres Programms sind das auch zwei Argumente, jedoch beziehen
sich die Variablen $argc
und $argv
nicht auf den Aufruf unseres Programms, sondern auf den Aufruf des PHP-Interpreters.
Also zählt $argc
die Argumente, die wir nach php
eingeben, und da kommt als Erstes der Name unseres Programms, das somit das erste Argument ist.
Folglich sehen wir in der Ausgabe von $argv
beim Schlüsselwert 0 den Programmnamen argumente.php
und hinter den Schlüsselwerten 1 und 2 folgen die Zahlen 25 und 9.
Standard-Ein- und -Ausgabe
Kommandozeilenprogramme erhalten ihre Daten von der Standardeingabe und senden ihre Ergebnisse zur
Standardausgabe. Der Zugriff darauf ist in PHP vorbereitet:
-
php://stdin
steht für Standardeingabe
php://stdout
steht für Standardausgabe und
php://stderr
für die Standardfehlerausgabe gibt es ebenfalls.
Nun brauchen wir Ein- und Ausgabefunktionen, die diese Ausdrücke unterstützen.
Sehr einfach zu verwendende Funktionen sind file_get_contents()
(liest Daten aus einer Datei) und file_put_contents()
(beschreibt eine Datei).
Das nützt uns insofern, weil wir Ausdrücke für Standardein- und -ausgabe in Doublequotes
gesetzt wie Dateinamen angeben können. Das kleine Programm pipeline.php
nutzt diese Funktionen, um Daten von der Standardeingabe kommend unverändert zur
Standardausgabe zu senden.
<?php
# pipeline.php
file_put_contents("php://stdout", file_get_contents());
?>
Und so sieht es im Screenshot aus:
C:\Users\root\PHP-Beispiele>echo "Hallo, Welt!" | php pipeline.php
"Hallo, Welt!"
Daten bearbeiten und weiterleiten
Mit diesem Ansatz können wir bereits einfache Filterprogramme schreiben.
Das Programm filter.php sammelt die von der Standardeingabe gekommenen Daten
in der Variablen $content
.
Nun können wir die Daten beliebig verändern und das Ergebnis wird zur Standardausgabe senden.
Als Bearbeitungs-Beispiel dient die Funktion strtoupper()
(Text in Großbuchstaben umwandeln).
<?php
# filter.php
$content = file_get_contents("php://stdin");
# Beliebige Bearbeitung möglich
# Umwandlung in Großbuchstaben als Beispiel
$content = strtoupper($content);
file_put_contents("php://stdout", $content);
?>
Die Ausführung in der Eingabeaufforderung:
C:\Users\root\PHP-Beispiele>echo "Hallo, Welt!" | php filter.php
"HALLO, WELT!"
Und im Textfenster von Cygwin, in dem ein weiteres Verketten gezeigt werden kann:
/cygdrive/c/Users/root/PHP-Beispiele
$ echo "Hallo, Welt!" | php filter.php
HALLO, WELT!
/cygdrive/c/Users/root/PHP-Beispiele
$ echo "Hallo, Welt!" | php filter.php | wc
1 2 13
Das Kommando wc
zählt das Zeilenendezeichen mit.
PHP-Script als Shellscript
Unter Linux besteht die Möglichkeit, ein Shellscript zu schreiben, das für den Inhalt
einen eigenen Interpreter auswählt. In der sogenannten She-Bang-Zeile (die erste Zeile im Script) wird der absolute Dateipfad des Interpreters angegeben.
Dieser Pfad hängt von der PHP-Installation ab.
Tatsächlich bleibt der PHP-Code völlig unverändert, nur eben die She-Bang-Zeile
muss davor gesetzt werden. Das folgende Script heißt filter.sh
.
#!/cygdrive/c/xampp/php/php
<?php
# filter.php
$content = file_get_contents("php://stdin");
# Beliebige Bearbeitung möglich
# Umwandlung in Großbuchstaben als Beispiel
$content = strtoupper($content);
file_put_contents("php://stdout", $content);
?>
Freundlicherweise funktioniert das alles auch unter Cygwin:
/cygdrive/c/Users/root/PHP-Beispiele
$ echo "Hallo, Welt!" | filter.sh
HALLO, WELT!
/cygdrive/c/Users/root/PHP-Beispiele
$ echo "Hallo, Welt!" | filter.sh | wc
2 2 13
Der PHP-Interpreter wird implizit aufgerufen und das Filterprogramm kann wie ein reguläres Kommando
verwendet werden.