Nutzung von PHP auf der KommandozeileNutzung der KommandzeileIntroduction
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 SAPIs
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;-DirektivenDirektive&cli; SAPI-StandardwertKommentarhtml_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_time0 (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
CGI-SAPI 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.
KommandozeilenoptionenOptionen
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 .
]]>
KommandozeilenoptionenOptionLangformBeschreibung-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 -d 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--modulesAusgabe 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 , und
, 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 , um den
SAPI-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.
--ini-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 --rf-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.
--rc-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.
--re-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.
--ri-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-DateienVerwendung
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 AusgabestreamsI/O Streams
Die &cli.sapi; definiert einige Konstanten für Ein- und Ausgabestreams, um
das Erstellen von Kommandozeilenanwendungen zu erleichtern.
CLI-spezifische KonstantenKonstanteBeschreibungSTDIN
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.
cli.prompt-Escape-SequenzenSequenzenBeschreibung\e
Wird verwendet, um Farben zur Eingabeaufforderung hinzuzufügen. Ein
Beispiel: \e[032m\v \e[031m\b \e[34m\> \e[0m\vDie 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
CTRLD
(POSIX) oder
CTRLZ
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