Nutzung von PHP auf der Kommandozeile Nutzung der Kommandzeile
Introduction Das Hauptaugenmerk der &cli.sapi; liegt auf der Entwicklung von Kommandozeilenanwendungen. Es gibt einige Unterschiede zwischen der &cli.sapi; und anderen SAPIs, welche in diesem Kapitel beschrieben werden. Es ist erwähnenswert, dass &cli; und CGI verschiedene SAPIs sind, auch wenn sie viele Verhaltensweisen teilen. Die &cli.sapi; ist standardmäßig durch die Option aktiviert, kann jedoch durch Angabe der Option im ./configure-Skript deaktiviert werden. Der Name, der Pfad und das Vorhandensein der &cli;/CGI-Binaries hängt davon ab, wie PHP auf dem System installiert wurde. Standarmäßig werden nach dem Aufruf von make sowohl CGI als auch &cli; kompiliert und als sapi/cgi/php-cgi beziehungsweise sapi/cli/php in Ihrem PHP-Quellcodeverzeichnis gespeichert. Sie werden bemerken, dass beide php heißen. Was während make install passiert, hängt davon ab, wie PHP konfiguriert wurde. Wenn bei der Konfiguration eine Modul-SAPI wie &zb; apxs gewählt wurde oder die Option genutzt wurde, wird die &cli; während make install nach {PREFIX}/bin/php kopiert. Andernfalls wird das CGI-Binary dorthin kopiert. Also wird, wenn beispielsweise in Ihrem configure-Kommando angegeben ist, die &cli; während make install nach {PREFIX}/bin/php kopiert. Wenn Sie die Installation des CGI-Binaries überschreiben wollen, verwenden Sie make install-cli nach make install. Alternativ können Sie in Ihrem configure-Kommando angeben. Weil sowohl als auch standardmäßig eingeschaltet sind, muss in Ihrem configure-Kommando nicht zwingend bedeuten, dass die &cli; während make install nach {PREFIX}/bin/php kopiert wird. Auf Windows wird das &cli;-Binary im Hauptordner als php.exe ausgeliefert. Die CGI-Version wird als php-cgi.exe bereitgestellt. Zusätzlich wird php-win.exe ausgeliefert, wenn PHP mit konfiguriert wurde. Dieses Binary verhält sich genauso wie die &cli;-Version, bis auf die Tatsache, dass sie nichts ausgibt und somit keine Konsole zur Verfügung stellt. Welche SAPI habe ich? Auf der Kommandozeile wird Ihnen die Eingabe von php -v verraten, ob Sie php als CGI oder &cli; einsetzen. Sehen Sie sich auch die Funktion php_sapi_name und die Konstante PHP_SAPI an. Eine UNIX-manpage ist durch Eingabe von man php auf der Kommandozeile verfügbar.
Unterschiede zu anderen <acronym>SAPI</acronym>s Wesentliche Unterschiede der &cli;-SAPI zu anderen SAPIs: Anders als bei der CGI-SAPI werden keine Header ausgegeben. Obwohl die CGI-SAPI eine Option bietet, HTTP-Header zu unterdrücken, gibt es keine gleichwertige Option, sie in der &cli.sapi; anzuzeigen. &cli; wird standardmäßig im stillen Modus gestartet, dennoch gibt es die Optionen und aus Kompatibilitätsgründen noch, sodass auch ältere CGI-Skripte noch verwendet werden können. Es wechselt das Arbeitsverzeichnis nicht in das des Skriptes. (Die Optionen und wurden aus Kompatibilitätsgründen beibehalten.) Fehlermeldungen im Klartext (keine HTML-Formatierung). Es gibt bestimmte &php.ini;-Direktiven, die von der &cli.sapi; außer Kraft gesetzt werden, weil sie in einer Kommandozeilenumgebung keinen Sinn ergeben. Überschriebene &php.ini;-Direktiven Direktive &cli; SAPI-Standardwert Kommentar html_errors &false; Die Standardeinstellung ist &false;, weil es sehr schwierig sein kann, Fehlermeldunge auf der Kommandozeile zu lesen, wenn sie mit bedeutungslosen HTML-Tags vollgestopft ist. implicit_flush &true; Auf der Kommandozeile ist es normalerweise erwünscht, dass alle Ausgaben, die von print, echo und Konsorten kommen, sofort angezeigt werden und nicht in einem Puffer zwischengespeichert werden. Es ist jedoch immer noch möglich, output buffering zu verwenden, um die Standardausgabe aufzuschieben oder zu manipulieren. max_execution_time 0 (unendlich) Da die Anwendungsbereiche von PHP auf der Kommandozeile wesentlich vielfältiger sind als in webbasierten Anwendungen und oft lange Laufzeiten besitzen, wird die maximale Ausführungszeit auf unendlich gesetzt. register_argc_argv &true; Weil diese Einstellung auf &true; gesetzt ist, haben Skripte, die über die &cli;-SAPI ausgeführt werden, immer Zugriff auf argc (die Anzahl der Argumente, die der Anwendung übergeben wurden) und argv (das Array mit den übergebenen Argumenten). Die PHP-Variablen $argc und $argv werden automatisch mit den entsprechenden Werten gefüllt, wenn die &cli;-SAPI verwendet wird. Diese Werte können auch im Array $_SERVER gefunden werden, beispielsweise: $_SERVER['argv']. Wenn register_argc_argv aktiviert ist, ist das Vorhandensein von $argv oder $_SERVER['argv'] kein zuverlässiger Hinweis darauf, dass ein Skript von der Kommandozeile aus ausgeführt wird, da diese Variablen auch in anderen Kontexten gesetzt werden können. Stattdessen sollte der von php_sapi_name zurückgegebene Wert überprüft werden. output_buffering &false; Auch wenn diese &php.ini;-Option fest auf &false; gesetzt ist, sind die Funktionen der Ausgabepufferung verfügbar. max_input_time &false; Die PHP-&cli; unterstützt GET, POST und Dateiuploads nicht.
Diese Direktiven können nicht mit einem anderen Wert aus der Konfigurationsdatei &php.ini; oder einer eigenen (falls angegeben) initialisiert werden. Diese Einschränkung ergibt sich dadurch, dass diese Standardwerte angewandt werden, nachdem alle Konfigurationsdateien gelesen wurden. Dennoch können die Werte zur Laufzeit verändert werden (was aber nicht für alle dieser Direktiven einen Sinn ergibt, beispielsweise register_argc_argv). Es wird empfohlen ignore_user_abort für Kommandozeilenanwendungen zu setzen. Siehe ignore_user_abort für weitere Informationen.
Um die Arbeit auf der Kommandozeilenumgebung zu erleichtern, wurden einige Konstanten für Ein- und Ausgabestreams definiert. Die &cli.sapi; wechselt das aktuelle Arbeitsverzeichnis nicht ins Verzeichnis des ausgeführten Skripts. Beispiel, welches den Unterschied zur <acronym>CGI</acronym>-<acronym>SAPI</acronym> verdeutlicht: ]]> Bei der CGI-Version ist die Ausgabe folgende: Dies zeigt deutlich, dass PHP vom aktuellen Verzeichnis in das des ausgeführten Skriptes wechselt. Nutzung der &cli.sapi; führt zu folgender Ausgabe: Dies ermöglicht eine größere Flexibilität beim Erstellen von Kommandozeilenanwendungen in PHP. Die CGI-SAPI unterstützt das Verhalten der &cli.sapi; durch Angabe der Option beim Starten von der Kommandozeile.
Kommandozeilenoptionen Optionen Die Liste der Kommandozeilenoptionen, die das PHP-Binary bereitstellt, kann jederzeit abgerufen werden, indem PHP mit der Option gestartet wird: [--] [args...] php [options] -r [--] [args...] php [options] [-B ] -R [-E ] [--] [args...] php [options] [-B ] -F [-E ] [--] [args...] php [options] -- [args...] php [options] -a -a Run interactively -c | Look for php.ini file in this directory -n No php.ini file will be used -d foo[=bar] Define INI entry foo with value 'bar' -e Generate extended information for debugger/profiler -f Parse and execute . -h This help -i PHP information -l Syntax check only (lint) -m Show compiled in modules -r Run PHP without using script tags -B Run PHP before processing input lines -R Run PHP for every input line -F Parse and execute for every input line -E Run PHP after processing all input lines -H Hide any passed arguments from external tools. -S : Run with built-in web server. -t Specify document root for built-in web server. -s Output HTML syntax highlighted source. -v Version number -w Output source with stripped comments and whitespace. -z Load Zend extension . args... Arguments passed to script. Use -- args when first argument starts with - or script is read from stdin --ini Show configuration file names --rf Show information about function . --rc Show information about class . --re Show information about extension . --rz Show information about Zend extension . --ri Show configuration for extension . ]]> Kommandozeilenoptionen Option Langform Beschreibung -a --interactive Startet PHP im interaktiven Modus. Für weitere Informationen siehe die Dokumentation für den Interaktiven Modus. -b --bindpath Der Bind-Pfad für den externen FASTCGI-Servermodus (nur CGI). -C --no-chdir Nicht in das Verzeichnis des Skripts wechseln (nur CGI). -q --no-header Der Quiet-Modus. Unterdrücke die Ausgabe von HTTP-Headern (nur CGI). -T --timing Misst die Ausführungszeit des Skripts. Dies wird count mal durchgeführt (nur CGI). -c --php-ini Mit dieser Option kann man entweder ein Verzichnis angeben, in welchem nach der &php.ini; gesucht werden soll, oder man kann eine eigene INI-Datei angeben (diese muss nicht &php.ini; heissen). Zum Beispiel: Wenn diese Option nicht angegeben wird, wird die &php.ini;-Datei an den vorgegebenen Orten gesucht. -n --no-php-ini &php.ini; komplett ignorieren. -d --define Diese Option erlaubt es Ihnen, einen eigenen Wert für eine beliebige in &php.ini; erlaubte Direktive zu setzen. Die Syntax ist: Beispiel für die Verwendung von <literal>-d</literal> zum Setzen einer INI-Direktive -e --profile-info Erweiterte Informationen für Debugger/Profiler erstellen. -f --file Parst die angegebene Datei und führt sie aus. Das ist optional und kann weggelassen werden. Es genügt, nur den Dateinamen anzugeben. -h und -? --help und --usage Gibt eine Liste von Kommandozeilenoptionen mit kurzen Beschreibungen ihrer Funktion aus. -i --info Diese Kommandozeilenoption ruft phpinfo auf und gibt das Ergebnis aus. Wenn PHP nicht korrekt funktioniert, ist es empfehlenswert, php -i zu verwenden und nachzusehen, ob etwa Fehlermeldungen vor oder statt der Informationstabellen ausgegeben werden. Beachten Sie, dass die Ausgabe bei Verwendung des CGI-Modus in HTML erfolgt und deswegen ziemlich umfangreich ist. -l --syntax-check Überprüft die Syntax, führt aber den angegebenen PHP-Code nicht aus. Wenn kein Dateiname angegeben ist, wird die Eingabe von der Standardeingabe verarbeitet, andernfalls wird jede angegebene Datei überprüft. Bei Erfolg wird der Text No syntax errors detected in <filename> auf der Standardausgabe ausgegeben. Bei einem Fehler wird zusätzlich zum internen Parser-Fehler der Text Errors parsing <filename> auf der Standardausgabe ausgegeben. Wenn in den angegebenen Dateien (oder der Standardeingabe) irgendwelche Fehler gefunden werden, wird der Shell-Rückgabecode auf -1 gesetzt, andernfalls wird er auf 0 gesetzt. Diese Option findet keine fatalen Fehler (&zb; undefinierte Funktionen), die die Ausführung des Codes erfordern. Vor PHP 8.3.0 war es nur möglich, den Namen einer Datei anzugeben, die überprüft werden sollte. Diese Option funktioniert nicht zusammen mit der Option . -m --modules Ausgabe der geladenen PHP- und Zend-Module -r --run Diese Option erlaubt die Ausführung von PHP Code direkt von der Kommandozeile. Die PHP-Tags <?php und ?> werden nicht benötigt und verursachen einen Parsefehler, wenn sie dennoch vorhanden sind. Bei der Verwendung dieser Option in PHP ist besondere Vorsicht geboten, dass es nicht zu Kollisionen mit dem Ersetzen von Kommandozeilenvariablen durch die Shell kommt. Syntaxfehler beim Verwenden von doppelten Anführungszeichen Das Problem hier ist, dass auch sh/bash Variablen ersetzt, wenn doppelte Anführungszeichen (") verwendet werden. Weil die Variable $foo wahrscheinlich nicht definiert ist, wird die Variable zu nichts aufgelöst. Der entstehende Code, welcher PHP übergeben wird, sieht so aus: Der richtige Weg wäre, einfache Anführungszeichen (') zu verwenden. Variablen in einfachen Anführungszeichen werden von sh/bash nicht ersetzt. Verwendung einfacher Anführungszeichen, um ein Ersetzen der Variablen durch die Shell zu verhindern int(1) ["E_WARNING"]=> int(2) ["E_PARSE"]=> int(4) ["E_NOTICE"]=> int(8) ["E_CORE_ERROR"]=> [...] ]]> Wenn eine andere Kommandozeilenumgebung als sh/bash verwendet wird, könnten weitere Probleme auftreten. Gegebenenfalls kann unter &url.php.bugs; ein Bugreport erstellt werden. Man kann dennoch leicht in Schwierigkeiten geraten, wenn man versucht PHP- oder Shell-Variablen zu verwenden, oder Backslashes zum Maskieren verwendet. Sie wurden gewarnt! -r ist in der &cli.sapi; verfügbar, nicht jedoch in der CGI-SAPI. Diese Option ist für sehr einfachen Code gedacht, weshalb einige Direktiven wie etwa auto_prepend_file und auto_append_file in diesem Modus ignoriert werden. -B --process-begin PHP-Code, der ausgeführt werden soll, bevor stdin ausgewertet wird. -R --process-code PHP-Code, der für jede Eingabezeile ausgeführt werden soll. Es gibt zwei spezielle Variablen in diesem Modus: $argn und $argi. $argn enthält die Zeile, die PHP gerade verarbeitet und $argi enthält die Zeilennummer. -F --process-file PHP-Datei, die für jede Eingabezeile ausgeführt werden soll. -E --process-end PHP-Code, der nach der Verarbeitung der Eingabe ausgeführt werden soll. Nutzung der Optionen <option>-B</option>, <option>-R</option> und <option>-E</option>, um die Anzahl der Zeilen in einem Projekt zu zählen. -S --server Startet den eingebauten Webserver. -t --docroot Gibt den Document-Root (Wurzelverzeichnis der Dokumente) für den eingebauten Webserver an. -s --syntax-highlight und --syntax-highlighting Den Quelltext mit farblich hervorgehobener Syntax anzeigen. Diese Option verwendet den internen Mechanismus zum Parsen von Dateien, um eine HTML-Version mit Syntax-Highlighting auf die Standardausgabe zu schreiben. Beachten Sie, dass sie nur einen Block mit den HTML-Tags <code> [...] </code> erzeugt, jedoch keine HTML-Header. Diese Option funktioniert nicht zusammen mit . -v --version Nutzung von <option>-v</option>, um den <acronym>SAPI</acronym>-Namen, sowie die PHP- und Zend-Version zu ermitteln -w --strip Den Quelltext ohne Kommentare und Leerzeichen anzeigen. Diese Option funktioniert nicht zusammen mit . -z --zend-extension Eine Zend-Erweiterung laden. Wenn nur ein Dateiname angegeben wird, versucht PHP, die Erweiterung aus dem momentanen Standard-Bibliotheken-Pfad auf Ihrem System zu laden (auf Linux-Systemen normalerweise in /etc/ld.so.conf angegeben). Wenn ein Dateiname mit absoluter Pfadinformation übergeben wird, wird der Bibliotheken-Pfad des Systems nicht verwendet. Ein relativer Dateiname mit Pfadinformationen wird PHP veranlassen, zu versuchen, die Erweiterung in einem Pfad relativ zum aktuellen Verzeichnis zu laden. --ini Zeigt die Namen der Konfigurationsdateien und die durchsuchten Verzeichnisse. <literal>--ini</literal>-Beispiel --rf --rfunction Zeigt Informationen über die angegebene Funktion oder Klassenmethode (&zb; Anzahl und Namen der Parameter). Diese Option ist nur verfügbar, wenn PHP mit Reflection-Unterstützung kompiliert wurde. Einfache <literal>--rf</literal>-Nutzung public function var_dump ] { - Parameters [2] { Parameter #0 [ $var ] Parameter #1 [ $... ] } } ]]> --rc --rclass Zeigt Inforationen über die angegebene Klasse (Liste der Konstanten, Eigenschaften und Methoden). Diese Option ist nur verfügbar, wenn PHP mit Reflection-Unterstützung kompiliert wurde. <literal>--rc</literal>-Beispiel class Directory ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [3] { Method [ public method close ] { } Method [ public method rewind ] { } Method [ public method read ] { } } } ]]> --re --rextension Zeigt Informationen über die angegebene Erweiterung (Liste der &php.ini;-Optionen, definierte Funktionen, Konstanten und Klassen). Diese Option ist nur verfügbar, wenn PHP mit Reflection-Unterstützung kompiliert wurde. <literal>--re</literal>-Beispiel extension #19 json version 1.2.1 ] { - Functions { Function [ function json_encode ] { } Function [ function json_decode ] { } } } ]]> --rz --rzendextension Zeigt Konfiguration der angegebenen Zend-Erweiterung an (entspricht der von phpinfo zurückgegebenen Information). --ri --rextinfo Zeigt die Konfiguration der angegebenen Erweiterung an (entspricht der von phpinfo zurückgegebenen Information). Die Konfiguration des Sprachkerns kann über den speziellen Erweiterungsnamen "main" ermittelt werden. <literal>--ri</literal>-Beispiel enabled "Olson" Timezone Database Version => 2009.20 Timezone Database => internal Default timezone => Europe/Oslo Directive => Local Value => Master Value date.timezone => Europe/Oslo => Europe/Oslo date.default_latitude => 59.930972 => 59.930972 date.default_longitude => 10.776699 => 10.776699 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333 ]]>
Die Optionen -rBRFEH, --ini und --r[fcezi] sind nur für &cli; verfügbar.
Ausführen von PHP-Dateien Verwendung Es gibt drei verschiedene Wege, PHP-Code in der &cli.sapi; auszuführen: PHP mitteilen, eine bestimmte Datei auszuführen. Beide Methoden (ob die Option verwendet wird oder nicht) führen die Datei my_script.php aus. Zu beachten ist, dass es keine Einschränkungen dafür gibt, welche Dateien ausgeführt werden können; beispielsweise muss das PHP-Skript nicht auf .php enden. Den auszuführenden PHP-Code direkt auf der Kommandozeile angeben. Es muss besonders Acht gegeben werden auf die Ersetzung von Kommandozeilenvariablen und Benutzung von Anführungszeichen. Achten Sie darauf, dass sie keine PHP-Tags übergeben. Die Option benötigt diese nicht und löst einen Parser-Fehler aus, falls sie dennoch verwendet werden. Eingabe des PHP-Codes über die Standardeingabe (stdin). Dies eröffnet die Möglichkeit, PHP-Code dynamisch zu generieren und anschließend an das PHP-Binary zu übergeben, wie in diesem (ausgedachten) Beispiel dargestellt: final_output.txt ]]> Die drei Möglichkeiten zur Codeausführung können nicht kombiniert werden. Wie jede Kommandozeilenanwendung nimmt das PHP-Binary etliche Argumente entgegen, aber auch das PHP-Skript kann Argumente entgegennehmen. Die Anzahl der Argumente, die an ein Skript übergeben werden können, ist nicht von PHP beschränkt (und obwohl die Kommandozeilenumgebung ein Limit für die Anzahl der Zeichen hat, die übergeben werden können, wird dieses im Allgemeinen nicht erreicht werden). Die Argumente, die dem Skript übergeben werden, sind in dem globalen Array $argv gespeichert. Der erste Index (Null) enthält immer den Skriptnamen. Wenn der Code mittels der Option ausgeführt wurde, ist der Wert von $argv[0] "Standard input code"; vor PHP 7.2.0 war es ein Bindestrich (-). Selbiges gilt für Code, welcher über STDIN ausgeführt wird. Die zweite registrierte globale Variable ist $argc, welche die Anzahl der Elemente im Array $argv enthält, (nicht die Anzahl Argumente, die dem Skript übergeben wurden). Solange die Argumente, welche dem Skript übergeben werden, nicht mit dem Zeichen - beginnen, gibt es nichts besonderes zu beachten. Ein Argument zu übergeben, welches mit - beginnt, wird jedoch Probleme bereiten, da PHP denkt, dass es das Argument selbst verarbeiten muss, noch bevor das Skript ausgeführt wird. Nutzen Sie das Argument-Trennzeichen --, um dies zu vermeiden. Nachdem dieses Trennzeichen von PHP geparst wurde, wird jedes folgende Argument unangetastet an das Skript weitergereicht. [args...] [...] # Dies übergibt das Argument '-h' an Ihr Skript und zeigt die Optionen von PHP nicht an $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" } ]]> Es gibt auf Unix-Systemen jedoch einen weiteren Weg, um PHP für Kommandozeilenskripte zu verwenden. Sie können ein Skript erstellen, in dem die erste Zeile mit #!/usr/bin/php beginnt (oder wie auch immer der Pfad zu Ihrer PHP-&cli;-Binärdatei ist). Nachfolgend können Sie normalen PHP-Code innerhalb der PHP-Start- und -End-Tags verwenden. Sobald Sie die Datei ausführbar gemacht haben (beispielsweise mittels chmod +x test), kann Ihr Skript wie ein normales Kommandozeilen- oder Perl-Skript gestartet werden. PHP als Shellskript ausführen ]]> Angenommen, die Datei heißt test und befindet sich im aktuellen Verzeichnis, dann können wir nun folgendes tun: string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" } ]]> Wie zu sehen ist, muss in diesem Fall keine besondere Rücksicht auf die Übergabe von Parametern genommen werden, die mit - beginnen. Die ausführbare PHP-Datei kann verwendet werden, um PHP-Skripte vollkommen unabhängig von einem Webserver auszuführen. Auf Unix-Systemen sollte die spezielle erste Zeile #! ("Shebang") zu PHP-Skripten hinzugefügt werden, damit das System automatisch herausfinden kann, welches Programm zur Ausführung der Datei genutzt werden soll. Auf Windows-Systemen ist es möglich, php.exe mit der Doppelklick-Option der Erweiterung .php zu verknüpfen. Es kann auch eine Batchdatei erstellt werden, um das Skript von PHP ausführen zu lassen. Die erste Zeile, die dem Skript hinzugefügt wird, damit es unter UNIX läuft, stört unter Windows nicht, so dass auf diese Weise problemlos plattformübergreifende Programme geschrieben werden können. Im Folgenden wird anhand eines einfachen Beispiels gezeigt, wie ein PHP-Kommandozeilenprogramm geschrieben wird. Ein Skript, das von der Kommandozeile aus ausgeführt werden soll (script.php) Das ist ein Kommandozeilenprogramm in PHP mit einer Option. Verwendung: In dem oben beschriebenen Skript haben wir die erste Zeile dazu verwendet, anzugeben, dass die Datei von PHP ausgeführt werden soll. Wir arbeiten hier mit einer &cli;-Version, deswegen werden keine HTTP-Header ausgegeben. In dem obigen Programm wird zuerst überprüft, ob das notwendige Argument angeben ist (zusätzlich zum Skriptnamen, welcher auch gezählt wird). Wenn nicht, oder wenn das Argument , , oder war, wird eine Hilfe-Nachricht ausgegeben, welche $argv[0] nutzt, um den auf der Kommandozeile eingegebenen Skript-Namen auszugeben. Andernfalls wird das Argument genauso ausgegeben, wie es übergeben wurde. Um das obige Skript unter UNIX auszuführen, muss es zuerst ausführbar gemacht werden, und danach einfach als script.php GebeDasHierAus oder script.php -h aufgerufen werden. Unter Windows kann zu diesem Zweck eine Batchdatei erstellt werden: Batchdatei zur Ausführung eines Kommandozeilen-Skripts in PHP (script.bat) Angenommen, das obige Programm wurde script.php genannt und die &cli; php.exe hat den Pfad C:\php\php.exe, so wird diese Batchdatei es mit allen übergebenen Argumenten aufrufen: script.bat GebeDasHierAus oder script.bat -h. Siehe auch die Readline-Erweiterung für weitere Funktionen, um PHP-Kommandozeilenanwendungen zu verbessern. Unter Windows kann PHP so konfiguiert werden, dass es auch ausgeführt wird, wenn weder C:\php\php.exe angegeben wird, noch die Dateierweiterung .php genutzt wird. Siehe dazu die Dokumentation zur PHP-Kommandozeile unter Microsoft Windows. Unter Windows wird empfohlen, PHP unter einem echten User-Account auszuführen. Wird es unter einem Netzwerk-Account ausgeführt, werden bestimmte Operationen fehlschlagen, weil "keine Zuordnung zwischen Kontennamen und Sicherheits-IDs erfolgte".
Ein- und Ausgabestreams I/O Streams Die &cli.sapi; definiert einige Konstanten für Ein- und Ausgabestreams, um das Erstellen von Kommandozeilenanwendungen zu erleichtern. CLI-spezifische Konstanten Konstante Beschreibung STDIN Ein schon geöffneter Stream auf stdin. Dies erspart das Öffnen mit ]]> Wenn sie einzelne Zeilen von stdin lesen wollen, können Sie folgendes Code-Fragment verwenden: ]]> STDOUT Ein schon geöffneter Stream auf stdout. Das erspart das Öffnen mit ]]> STDERR Ein schon geöffneter Stream auf stderr. Das erspart das Öffnen mit ]]>
Angesichts des oben Genannten, brauchen Sie beispielsweise nicht selbst einen Stream für stderr öffnen, sondern können einfach die Konstante anstelle der Ressource verwenden: Sie brauchen diese Streams nicht explizit zu schließen, weil sie automatisch von PHP geschlossen werden, wenn Ihr Skript endet. Diese Konstanten sind nicht verfügbar, wenn ein PHP Skript von stdin eingelesen wird.
Interaktive Shell Wenn PHP mit der Option kompiliert wurde, bietet die &cli.sapi; mit der Option eine interaktive Shell an. Von PHP 7.1.0 an steht die interaktive Shell auch unter Windows zu Verfügung, wenn die readline-Erweiterung aktiviert ist. Mittels der interaktiven Shell können Sie PHP-Code eingeben und direkt ausführen lassen. Ausführung von Code in der interaktiven Shell echo 5+8; 13 php > function addTwo($n) php > { php { return $n + 2; php { } php > var_dump(addtwo(2)); int(4) php > ]]> Die interaktive Shell bietet auch Tabulator-Autovervollständigung für Funktionen, Konstanten, Klassen, Variablen, statische Methoden und Klassenkonstanten. Tabulator-Autovervollständigung Wenn es mehrere mögliche Vervollständigungen gibt, wird durch zweimaliges Drücken der Tabulator-Taste eine Liste dieser Vervollständigungen angezeigt: strp[TAB][TAB] strpbrk strpos strptime php > strp ]]> Wenn es nur eine mögliche Vervollständigung gibt, führt ein einmaliges Drücken der Tabulator-Taste zur Vervollständigung der Zeile: strpt[TAB]ime( ]]> Autovervollständigung funktioniert auch für Namen, welche bereits während dieser interaktiven Session definiert wurden: $fooThisIsAReallyLongVariableName = 42; php > $foo[TAB]ThisIsAReallyLongVariableName ]]> Die interaktive Shell speichert den Verlauf von zuletzt eingegeben Zeilen, auf die mittels der Pfeiltasten zugegriffen werden kann. Der Verlauf wird in der Datei ~/.php_history gespeichert. Seit PHP 8.4.0 kann der Pfad zur History-Datei mit der Umgebungsvariablen PHP_HISTFILE festgelegt werden. Die &cli.sapi; bietet die &php.ini;-Optionen cli.pager und cli.prompt. Die Option cli.pager erlaubt einem externen Programm (wie etwa less) als Pager für die Ausgabe zu agieren, anstatt dass diese direkt ausgegeben wird. Die Option cli.prompt erlaubt das Ändern der php >-Eingabeaufforderung. Es ist auch möglich, die &php.ini;-Optionen in der interaktiven Shell zu setzen, indem man eine Kurzschreibweise verwendet. Setzen von &php.ini;-Optionen in der interaktiven Shell Die Option cli.prompt: #cli.prompt=hello world :> hello world :> ]]> Mittels Backticks kann PHP-Code in der Eingabeaufforderung ausgeführt werden: #cli.prompt=`echo date('H:i:s');` php > 15:49:35 php > echo 'hi'; hi 15:49:43 php > sleep(2); 15:49:45 php > ]]> Setzen des Pagers auf less: #cli.pager=less php > phpinfo(); (output displayed in less) php > ]]> Die Option cli.prompt unterstützt einige Escape-Sequenzen. <parameter>cli.prompt</parameter>-Escape-Sequenzen Sequenzen Beschreibung \e Wird verwendet, um Farben zur Eingabeaufforderung hinzuzufügen. Ein Beispiel: \e[032m\v \e[031m\b \e[34m\> \e[0m \v Die PHP-Version. \b Gibt an, in welchem Block sich PHP befindet. Zum Beispiel gibt /* an, dass man sich gerade in einem mehrzeiligen Kommentar befindet. Der äußerste Block ist php. \> Gibt das Eingabeaufforderungszeichen an. Standardmäßig ist dies >, ändert sich jedoch, wenn sich die Shell innerhalb eines nicht beendeten Blocks oder Strings befindet. Mögliche Zeichen sind: ' " { ( >
Dateien, die mit auto_prepend_file und auto_append_file eingebunden wurden, werden in diesem Modus mit einigen Einschränkungen geparst - &zb; müssen Funktionen vor dem Aufruf definiert werden.
Interaktiver Modus Wenn die readline-Erweiterung nicht verfügbar ist, wurde vor PHP 8.1.0 durch den Aufruf von &cli.sapi; mit der Option in den interaktiven Modus gewechselt. In diesem Modus muss ein komplettes PHP-Skript über STDIN übergeben werden, das nach dem Beenden mit CTRL D (POSIX) oder CTRL Z gefolgt von ENTER (Windows) ausgewertet wird. Dies ist im Grunde dasselbe wie der Aufruf von &cli.sapi; ohne die Option . Seit PHP 8.1.0 schlägt der Aufruf von &cli.sapi; mit der Option fehl, wenn die readline-Erweiterung nicht verfügbar ist.
Eingebauter Webserver Dieser Webserver wurde entwickelt, um bei der Anwendungsentwicklung zu helfen. Er kann ebenso für Testzwecke und für Anwendungsdemonstrationen nützlich sein, die in kontrollierten Umgebungen ausgeführt werden. Er ist nicht als voll funktioneller Webserver gedacht. Er sollte nicht in einem öffentlichen Netzwerk verwendet werden. Die &cli.sapi; bietet einen eingebauten Webserver. Der Webserver läuft nur mit einem single-threaded Prozess, sodass PHP-Anwendungen nicht weiter ausgeführt werden, wenn eine Anfrage blockiert wird. URI-Anfragen werden vom aktuellen Arbeitsverzeichnis ausgehend ausgeliefert, sofern nicht die -t Option genutzt wurde um ein explizites Document-Root anzugeben. Wenn eine URI-Anfrage keine Datei angibt, wird entweder index.php oder index.html aus dem aufgerufenen Verzeichnis zurückgegeben. Wenn beide Dateien nicht existieren, wird die Suche von index.php und index.html im übergeordneten Verzeichnis fortgesetzt usw., bis eine gefunden wurde, oder das Document-Root erreicht wurde. Wurde eine index.php oder index.html gefunden, wird sie zurückgegeben und $_SERVER['PATH_INFO'] wird auf den abschließenden Teil des URI gesetzt. Andernfalls wird ein 404-Antwortcode zurückgeben. Wenn auf der Kommandozeile beim Starten des Webservers eine PHP-Datei angegeben wird, wird diese als "Router"-Skript verwendet. Dieses Skript wird dann zu Beginn jeder HTTP-Anfrage gestartet. Wenn dieses Skript &false; zurückgibt, dann wird die angefragte Ressource direkt zurückgegeben. Andernfalls wird die Ausgabe des Skripts zurückgegeben. Standard-MIME-Typen werden für Dateien mit den folgenden Erweiterungen zurückgegeben: .3gp .apk .avi .bmp .css .csv .doc .docx .flac .gif .gz .gzip .htm .html .ics .jpe .jpeg .jpg .js .kml .kmz .m4a .mov .mp3 .mp4 .mpeg .mpg .odp .ods .odt .oga .ogg .ogv .pdf .png .pps .pptx .qt .svg .swf .tar .text .tif .txt .wav .webm .wmv .xls .xlsx .xml .xsl .xsd .zip . Seit PHP 7.4.0 kann der eingebaute Webserver so konfiguriert werden, dass mehrere Worker geforkt werden können, um Code zu testen, der mehrere gleichzeitige Anfragen erfordert. Dazu muss die Umgebungsvariable PHP_CLI_SERVER_WORKERS auf die Zahl der gewünschten Worker gesetzt werden, bevor der Server gestartet wird. Dieses Feature wird unter Windows nicht unterstützt. Dieses experimentelle Feature ist nicht für den Produktionseinsatz vorgesehen. Der eingebaute Webserver ist grundsätzlich nicht für den Produktionseinsatz vorgesehen. Starten des Webservers Die Kommandozeile wird ausgeben: Nach URI-Anfragen für http://localhost:8000/ und http://localhost:8000/myscript.html wird die Kommandozeile in etwa so aussehen: Es ist zu beachten, dass bis zu PHP 7.4.0 symbolisch verknüpfte statische Ressourcen unter Windows nicht erreichbar waren, es sei denn, das Router-Skript würde diese verarbeiten. Starten mit einer expliziten Document-Root Die Kommandozeile wird ausgeben: Nutzung eines Router-Skripts In diesem Beispiel werden bei Anfragen nach Bildern diese direkt angezeigt; bei Anfragen nach HTML-Dateien wird stattdessen "Willkommen in PHP!" angezeigt. Willkommen in PHP!

"; } ?>]]>
Prüfung auf die Verwendung des CLI-Webservers Um ein Framework-Router-Skript sowohl während der Entwicklung mit dem CLI-Webserver als auch später mit einem Produktions-Webserver zu verwenden: ]]> Behandlung nicht unterstützter Dateitypen Wenn Sie statische Ressourcen ausliefern müssen, deren MIME-Typ vom CLI-Webserver nicht unterstützt wird, verwenden Sie: ]]> Zugriff auf den CLI-Webserver von anderen Computern aus Sie können den Webserver wie folgt auf Port 8000 für jeden zugänglich machen: Der eingebaute Webserver sollte nicht in einem öffentlichen Netzwerk verwendet werden.
INI-Einstellungen CLI-SAPI-Konfigurations-Direktiven &Name; &Default; &Changeable; &Changelog; cli_server.color "0" INI_ALL
&ini.descriptions.title; cli_server.color bool Gibt an, ob der eingebaute Webserver ANSI-Color-Codes für Ausgaben auf die Kommandozeile nutzen soll.