PHP

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.