Heim > Artikel > Backend-Entwicklung > PHP-Befehlszeilenmodus
Ab Version 4.3.0 bietet PHP eine neue Art von CLI-SAPI-Unterstützung (Server Application Programming Interface, Server Application Programming Port) mit dem Namen CLI, was Command Line Interface bedeutet, also Befehlszeilenschnittstelle. Wie der Name schon sagt, wird das CLI-SAPI-Modul hauptsächlich als Entwicklungs-Shell-Anwendung für PHP verwendet. Es gibt viele Unterschiede zwischen CLI SAPI und anderen CLI SAPI-Modulen, auf die wir in diesem Kapitel näher eingehen werden. Es ist erwähnenswert, dass CLI und CGI unterschiedliche SAPIs sind, obwohl sie viele gemeinsame Verhaltensweisen aufweisen.
CLI SAPI wurde erstmals mit PHP 4.2.0 veröffentlicht, ist aber immer noch nur eine experimentelle Version und erfordert das Hinzufügen des Parameters --enable-cli beim Ausführen von ./configure. Ab PHP Version 4.3.0 ist CLI SAPI zu einem formalen Modul geworden. Der Parameter --enable-cli ist standardmäßig aktiviert und kann auch mit dem Parameter --disable-cli blockiert werden.
Ab PHP 4.3.0 variieren Dateiname, Speicherort und Vorhandensein von CLI/CGI-Binärdateien je nachdem, wie PHP auf dem System installiert ist. Standardmäßig werden CGI und CLI beim Ausführen von make kompiliert und unter sapi/cgi/php bzw. sapi/cli/php im PHP-Quelldateiverzeichnis abgelegt. Beachten Sie, dass beide Dateien den Namen php haben. Was bei make install passiert, hängt von der Konfigurationszeile ab. Wenn während der Konfiguration ein SAPI-Modul wie apxs ausgewählt oder der Parameter --disable-cgi verwendet wird, wird die CLI während des Make-Installationsvorgangs nach {PREFIX}/bin/php kopiert, es sei denn, CGI wurde eingefügt diese Position. Wenn Sie also beispielsweise --with--apxs in der Konfigurationszeile haben, wird die CLI während der Make-Installation nach {PREFIX}/bin/php kopiert. Wenn Sie die Installation der ausführbaren CGI-Datei rückgängig machen möchten, führen Sie nach make install make install-cli aus. Alternativ können Sie den Parameter --disable-cgi zur Konfigurationszeile hinzufügen.
Hinweis:
Da --enable-cli und --enable-cgi beide standardmäßig gültig sind, ist es nicht erforderlich, --enable-cli zur Konfigurationszeile hinzuzufügen, um das zu erstellen CLI wird in make install ausgeführt. Es wird während des Vorgangs nach {PREFIX}/bin/php kopiert.
In Windows-Distributionspaketen zwischen PHP 4.2.0 und PHP 4.2.3 lautet der CLI-Dateiname php-cli.exe und php.exe im selben Ordner ist CGI. Ab der PHP-Version 4.3.0 ist die CLI-Ausführungsdatei im Windows-Distributionspaket php.exe, die in einem separaten Ordner namens cli abgelegt wird, nämlich cli/php.exe. In PHP 5 existiert die CLI im Home-Ordner als php.exe und die CGI-Version heißt php-cgi.exe.
Ab PHP 5 wird eine neue Datei namens php-win.exe mit dem Paket veröffentlicht. Es entspricht der CLI-Version, allerdings gibt php-win nichts aus und stellt daher keine Konsole zur Verfügung (es erscheint kein „DOS-Fenster“). Dieser Ansatz ähnelt PHP-GTK. Es muss mit der Option --enable-cli-win32 konfiguriert werden.
Hinweis: Woher wissen Sie, welches SAPI Sie verwenden?
Führen Sie in der Befehlszeile php -v aus, um zu erfahren, ob es sich bei PHP um CGI oder CLI handelt. Bitte beachten Sie die Funktion php_sapi_name() und die Konstante PHP_SAPI.
Hinweis:
Die Unix-Manpage wurde in PHP 4.3.2 hinzugefügt. Sie können man php in die Befehlszeile eingeben, um es anzuzeigen.
Im Folgenden sind die wesentlichen Unterschiede zwischen CLI SAPI und anderen CLI SAPI-Modulen aufgeführt:
Im Gegensatz zu CGI SAPI enthält die Ausgabe keine Header-Informationen. Obwohl die CGI-SAPI eine Methode zum Unterdrücken von HTTP-Header-Informationen bereitstellt, gibt es in der CLI-SAPI keine ähnliche Methode, um die Ausgabe von HTTP-Header-Informationen zu ermöglichen. Die CLI startet standardmäßig im stillen Modus, aber um die Kompatibilität sicherzustellen, werden die Parameter -q und --no-header aus Gründen der Abwärtskompatibilität weiterhin beibehalten, sodass die Verwendung älterer CGI-Skripte möglich ist. Bei der Ausführung wird das Arbeitsverzeichnis nicht in das aktuelle Verzeichnis des Skripts geändert (Sie können die Parameter -C und --no-chdir verwenden, um mit dem CGI-Modus kompatibel zu sein). Gibt eine Fehlermeldung im Klartext (nicht im HTML-Format) aus, wenn ein Fehler auftritt.
CLI SAPI überschreibt zwangsweise bestimmte Einstellungen in php.ini, da diese Einstellungen in einer Shell-Umgebung bedeutungslos sind.
php.ini-Einstellungsoptionen überschreiben
Einstellungsoptionen
CLI SAPI-Standardwert
Bemerkungen
html_errors FALSE Bedeutungslose HTML-Tags überladen die Fehlermeldung, sodass es sehr schwierig ist, die Fehlermeldung unter der Shell zu lesen. Ändern Sie daher den Standardwert dieser Option auf FALSE.
implicit_flush TRUE Im Befehlszeilenmodus werden alle Ausgaben von print und echo sofort ohne Puffervorgänge in die Ausgabe geschrieben. Wenn Sie die Standardausgabe verzögern oder steuern möchten, können Sie weiterhin die Einstellung für die Ausgabepufferung verwenden.
max_execution_time 0 (unendlicher Wert) Angesichts der endlosen Möglichkeiten der Verwendung von PHP in einer Shell-Umgebung wird die maximale Ausführungszeit auf einen unendlichen Wert festgelegt. Die Ausführung einer für das Web entwickelten Anwendung dauert möglicherweise nur wenige Sekunden, während die Ausführung einer Shell-Anwendung möglicherweise viel länger dauert.
register_argc_argv TRUE Da dies auf TRUE gesetzt ist, sind argc (die Anzahl der an die Anwendung übergebenen Argumente) und argv (das Array mit den tatsächlichen Argumenten) in der CLI-SAPI immer zugänglich. Ab PHP 4.3.0 wurden bei Verwendung der CLI-SAPI die PHP-Variablen $argc und $argv registriert und auf die entsprechenden Werte gesetzt. In früheren Versionen basierte die Einrichtung dieser beiden Variablen in der CGI- oder Modulversion auf der Einstellung der PHP-Einstellungsoption register_globals auf „on“. Zusätzlich zu den Versions- und register_globals-Einstellungen kann jederzeit durch Aufruf von $_SERVER oder $HTTP_SERVER_VARS auf sie zugegriffen werden. Zum Beispiel: $_SERVER['argv']
Hinweis:
Diese Einstellungen können nicht auf andere Werte in der Einstellungsdatei php.ini oder einer anderen angegebenen Datei initialisiert werden. Diese Standardwerte sind auf Änderungen beschränkt, nachdem alle anderen Einstellungsdateien analysiert wurden. Ihre Werte können jedoch geändert werden, während das Programm läuft (obwohl diese Einstellungen für den laufenden Prozess bedeutungslos sind).
Um die Arbeit in der Shell-Umgebung zu erleichtern, haben wir folgende Konstanten definiert:
CLI-spezifische Konstanten
Konstante Name
Beschreibung
STDIN Ein offener Stream, der auf stdin zeigt. Es kann mit der folgenden Methode aufgerufen werden:
<?php $stdin = fopen('php://stdin', 'r'); ?>
Wenn Sie eine Zeile von stdin lesen möchten, können Sie
<?php $line = trim(fgets(STDIN)); // 从 STDIN 读取一行 fscanf(STDIN, "%d\n", $number); // 从 STDIN 读取数字 ?>
verwenden. STDOUT Ein offener Stream, der auf stdout zeigt . Kann auf folgende Weise aufgerufen werden:
<?php $stdout = fopen('php://stdout', 'w'); ?>
STDERR Ein offener Stream, der auf stderr zeigt. Es kann wie folgt aufgerufen werden:
<?php $stderr = fopen('php://stderr', 'w'); ?>
Mit den oben genannten Konstanten müssen Sie keinen Stream erstellen, der auf stderr verweist. Sie können diese Konstanten einfach zum Ersetzen verwenden der Stream zeigt:
php -r 'fwrite(STDERR, "stderr\n");'
Sie müssen diese Streams nicht selbst schließen, PHP erledigt dies automatisch.
CLI SAPI ändert das aktuelle Verzeichnis nicht in das Verzeichnis, in dem das Skript ausgeführt wird. Das folgende Beispiel zeigt den Unterschied zwischen diesem Modul und dem CGI-SAPI-Modul:
<?php // 名为 test.php 的简单测试程序 echo getcwd(), "\n"; ?>
Bei Verwendung der CGI-Version lautet die Ausgabe
$ pwd /tmp $ php-cgi -f another_directory/test.php /tmp/another_directory
Sie können offensichtlich erkennen, dass sich PHP ändern wird das aktuelle Verzeichnis. Ändern Sie es in das Verzeichnis, in dem sich das gerade ausgeführte Skript befindet.
Mit dem CLI-SAPI-Modus erhalten Sie:
$ pwd /tmp $ php -q another_directory/test.php /tmp
Dies macht es sehr praktisch, Shell-Tools mit PHP zu schreiben.
Hinweis:
Sie können den Parameter -C zur CGI-SAPI hinzufügen, wenn Sie sie über die Befehlszeile ausführen, damit sie die CLI-SAPI-Funktion unterstützt.
Im Folgenden sind die Parameter der Befehlszeilenmodusoptionen aufgeführt, die von der PHP-Binärdatei (d. h. dem Programm php.exe) bereitgestellt werden. Sie können den PHP-Befehl jederzeit mit dem Parameter -h ausführen, um diese Parameter abzufragen .
Usage: php [options] [-f] <file> [--] [args...] php [options] -r <code> [--] [args...] php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...] php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...] php [options] -- [args...] php [options] -a -a Run interactively -c <path>|<file> 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 <file> Parse <file>. -h This help -i PHP information -l Syntax check only (lint) -m Show compiled in modules -r <code> Run PHP <code> without using script tags <?..?> -B <begin_code> Run PHP <begin_code> before processing input lines -R <code> Run PHP <code> for every input line -F <file> Parse and execute <file> for every input line -E <end_code> Run PHP <end_code> after processing all input lines -H Hide any passed arguments from external tools. -s Display colour syntax highlighted source. -v Version number -w Display source with stripped comments and whitespace. -z <file> Load Zend extension <file>. args... Arguments passed to script. Use -- args when first argument starts with - or script is read from stdin
Das CLI-SAPI-Modul verfügt über die folgenden drei verschiedenen Möglichkeiten, den PHP-Code zur Ausführung zu bringen:
Lassen Sie PHP die angegebene Datei ausführen.
php my_script.php php -f my_script.php
Beide der oben genannten Methoden (mit oder ohne den Parameter -f) können die angegebene Datei my_script.php ausführen. Sie können eine beliebige Datei zum Ausführen auswählen. Die angegebenen PHP-Skripte müssen keine .php-Erweiterung haben, sie können einen beliebigen Dateinamen und eine beliebige Erweiterung haben.
Führen Sie PHP-Code direkt über die Befehlszeile aus.
php -r 'print_r(get_defined_constants());'
Achten Sie bei der Verwendung dieser Methode bitte auf die Ersetzung von Shell-Variablen und die Verwendung von Anführungszeichen.
Hinweis:
Bitte lesen Sie das obige Beispiel sorgfältig durch, es gibt keine Start- und Endmarkierungen, wenn Sie den Code ausführen! Mit dem Parameter -r sind diese Markierungen unnötig und führen zu Syntaxfehlern.
Stellt den PHP-Code bereit, der über die Standardeingabe (stdin) ausgeführt werden muss. Die obige Verwendung bietet sehr leistungsstarke Funktionen, die es ermöglichen, PHP-Code dynamisch zu generieren und diese Codes über die Befehlszeile auszuführen, wie im folgenden Beispiel gezeigt:
$ some_application | some_filter | php | sort -u >final_output.txt
Die oben genannten drei Methoden zum Ausführen von Code Kann nicht gleichzeitig verwendet werden.
Wie alle Shell-Anwendungen können die PHP-Binärdatei (php.exe-Datei) und das von ihr ausgeführte PHP-Skript eine Reihe von Parametern akzeptieren. PHP hat keine Begrenzung hinsichtlich der Anzahl der an ein Skript übergebenen Parameter (die Shell hat eine Begrenzung hinsichtlich der Anzahl der Zeichen in der Befehlszeile, diese Grenze wird jedoch normalerweise nicht überschritten). Die an das Skript übergebenen Argumente sind in der globalen Variablen $argv verfügbar. Das nullindizierte Mitglied dieses Arrays ist der Name des Skripts (wenn der PHP-Code von der Standardeingabe stammt und direkt über die Befehlszeile mit dem Parameter -r ausgeführt wird, lautet der Name „-“). Darüber hinaus speichert die globale Variable $argc die Anzahl der Mitgliedsvariablen im $argv-Array (nicht die Anzahl der an das Skriptprogramm übergebenen Parameter).
只要传送给脚本的参数不是以 - 符号开头,就无需过多的注意什么。向脚本传送以 - 开头的参数会导致错误,因为 PHP 会认为应该由它自身来处理这些参数。可以用参数列表分隔符 -- 来解决这个问题。在 PHP 解析完参数后,该符号后所有的参数将会被原样传送给脚本程序。
# 以下命令将不会运行 PHP 代码,而只显示 PHP 命令行模式的使用说明: $ php -r 'var_dump($argv);' -h Usage: php [options] [-f] <file> [args...] [...] # 以下命令将会把“-h”参数传送给脚本程序,PHP 不会显示命令行模式的使用说明: $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" }
除此之外,还有另一个方法将 PHP 用于外壳脚本。可以在写一个脚本,并在第一行以 #!/usr/bin/php 开头,在其后加上以 PHP 开始和结尾标记符包含的正常的 PHP 代码,然后为该文件设置正确的运行属性(例如:chmod +x test)。该方法可以使得该文件能够像外壳脚本或 PERL 脚本一样被直接执行。
#!/usr/bin/php <?php var_dump($argv); ?>
假设改文件名为 test 并被放置在当前目录下,可以做如下操作:
$ chmod +x test $ ./test -h -- foo array(4) { [0]=> string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" }
正如所看到的,在向该脚本传送以 - 开头的参数时,脚本仍然能够正常运行。
PHP 4.3.3 以来有效的长选项:
命令行选项
选项名称
长名称
说明
-a --interactive 交互式运行 PHP。如果编译 PHP 时加入了 Readline 扩展(Windows 下不可用),那将会得到一个很好的外壳,包括一个自动完成的功能(例如可以在键入变量名的时候,按下 TAB 键,PHP 会自动完成该变量名)以及命令历史记录,可以用上下键来访问。历史记录存在 ~/.php_history 文件中。
Note:
通过 auto_prepend_file 和 auto_append_file 包含的文件在此模式下会被解析,但有些限制,例如函数必须在被调用之前定义。
-c --php-ini 用该参数,可以指定一个放置 php.ini 文件的目录,或者直接指定一个自定义的 INI 文件(其文件名可以不是 php.ini),例如:
$ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php
如果不指定此选项,PHP 将在默认位置搜索文件。
-n --no-php-ini 完全忽略 php.ini。此参数在 PHP 4.3.0 以后有效。
-d --define 用该参数可以自行设置任何可以在 php.ini 文件中设置的配置选项的值,其语法为:
-d configuration_directive[=value]
例子(因版面原因而折行显示):
# 取值部分被省略,将会把配置选项设为 "1" $ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(1) "1" # 取值部分为空白,将会把配置选项设为 "" php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(0) "" # 配置选项将被设置成为任何 '=' 字符之后的值 $ php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(2) "20" $ php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(15) "doesntmakesense"
-e --profile-info 激活扩展信息模式,被用于调试/测试。
-f --file 解析并运行 -f 选项给定的文件名。该参数为可选参数,可以省略,仅指明需要运行的文件名即可。
-h and -? --help and --usage 使用该参数,可以得到完整的命令行参数的列表及这些参数作用的简单描述。
-i --info 该命令行参数会调用 phpinfo() 函数并显示出结果。如果 PHP 没有正常工作,建议执行 php -i 命令来查看在信息表格之前或者对应的地方是否有任何错误信息输出。请注意当使用 CGI 摸索时,输出的内容为 HTML 格式,因此输出的信息篇幅较大。
-l --syntax-check 该参数提供了对指定 PHP 代码进行语法检查的方便的方法。如果成功,则向标准输出写入 No syntax errors detected in 2334ac29606bf8a170583e4f7533b1f4 字符串,并且外壳返回值为 0。如果失败,则输出 Errors parsing 2334ac29606bf8a170583e4f7533b1f4 以及内部解析器错误信息到标准输出,同时外壳返回值将别设置为 255。该参数将无法检查致命错误(如未定义函数),如果也希望检测致命错误,请使用 -f 参数。
Note:
该参数不能和 -r 一同使用。
-m --modules 使用该参数,PHP 将打印出内置以及已加载的 PHP 及 Zend 模块:
$ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules]
-r --run 使用该参数可以在命令行内运行单行 PHP 代码。无需加上 PHP 的起始和结束标识符(eaae9fd1bc1dded8026482face6dba9c),否则将会导致语法解析错误。
Note:
使用这种形式的 PHP 时,应注意避免和外壳环境进行的命令行参数替换相冲突。
显示语法解析错误的范例
$ php -r "$foo = get_defined_constants();" Command line code(1) : Parse error - parse error, unexpected '='
这里的问题在于即使使用了双引号 ",sh/bash 仍然实行了参数替换。由于 $foo 没有被定义,被替换后它所在的位置变成了空字符,因此在运行时,实际被 PHP 读取的代码为:
$ php -r " = get_defined_constants();"
正确的方法是使用单引号 '。在用单引号引用的字符串中,变量不会被 sh/bash 还原成其原值。
$ php -r '$foo = get_defined_constants(); var_dump($foo);' array(370) { ["E_ERROR"]=> int(1) ["E_WARNING"]=> int(2) ["E_PARSE"]=> int(4) ["E_NOTICE"]=> int(8) ["E_CORE_ERROR"]=> [...]
如果使用的外壳不是 sh/bash,可能会碰到更多问题。请将碰到的 Bug 向 » http://bugs.php.net/ 报告。注意,当试图将 shell 变量用到代码中或者使用反斜线时仍然很容易碰到问题。
Note:
-r 在 CLI SAPI 中有效,在 CGI SAPI 中无效。
Note:
此选项只用于非常基本的用途。因此一些配置指令(例如 auto_prepend_file 和 auto_append_file)在此模式下被忽略。
-B --process-begin 在处理 stdin 之前先执行 PHP 代码。PHP 5 新加。
-R --process-code 对每个输入行都执行 PHP 代码。PHP 5 新加。此模式下有两个特殊变量:$argn 和 $argi。$argn 包含 PHP 当前处理的行内容,而 $argi 则包含该行号。
-F --process-file 对每个输入行都执行 PHP 文件。PHP 5 新加。
-E --process-end 在处理完输入后执行的 PHP 代码。PHP 5 新加。使用 -B ,-R 和 -E 选项来计算一个项目总行数的例子。
$ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Total Lines: $l\n";'Total Lines: 37328
-s --syntax-highlight and --syntax-highlight 显示有语法高亮色彩的源代码。该参数使用内建机制来解析文件并为其生成一个 HTML 高亮版本并将结果写到标准输出。请注意该过程所做的只是生成了一个 ffbe95d20f3893062224282accb13e8f [...] 1cd55414ff5abdfea5dd958e7e547fdd 的 HTML 标记的块,并不包含任何的 HTML 头。
Note:
该选项不能和 -r 参数同时使用。
-v --version 将 PHP,PHP SAPI 和 Zend 的版本信息写入标准输出。例如:
$ php -v PHP 4.3.0 (cli), Copyright (c) 1997-2002 The PHP GroupZend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
-w --strip 显示除去了注释和多余空白的源代码。
Note:
该选项不能和 -r 参数同时使用。
-z --zend-extension 加载 Zend 扩展库。如果仅给定一个文件名,PHP 将试图从当前系统扩展库的默认路径(在 Linux 系统下,该路径通常由 /etc/ld.so.conf 指定)加载该扩展库。如果用一个绝对路径指定文件名,则不会使用系统的扩展库默认路径。如果用相对路径指定的文件名,则 PHP 仅试图在当前目录的相对目录加载扩展库。
PHP 的命令行模式能使得 PHP 脚本能完全独立于 web 服务器单独运行。如果使用 Unix 系统,需要在 PHP 脚本的最前面加上一行特殊的代码,使得它能够被执行,这样系统就能知道用哪个程序去运行该脚本。在 Windows 平台下可以将 php.exe 和 .php 文件的双击属性相关联,也可以编写一个批处理文件来用 PHP 执行脚本。为 Unix 系统增加的第一行代码不会影响该脚本在 Windows 下的运行,因此也可以用该方法编写跨平台的脚本程序。以下是一个简单的 PHP 命令行程序的范例。
Example #1 试图以命令行方式运行的 PHP 脚本(script.php)
#!/usr/bin/php <?php if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) { ?> This is a command line PHP script with one option. Usage: <?php echo $argv[0]; ?> <option> <option> can be some word you would like to print out. With the --help, -help, -h, or -? options, you can get this help. <?php } else { echo $argv[1]; } ?>
在以上脚本中,用第一行特殊的代码来指明该文件应该由 PHP 来执行。在这里使用 CLI 的版本,因此不会有 HTTP 头信息输出。在用 PHP 编写命令行应用程序时,可以使用两个参数:$argc 和 $argv。前面一个的值是比参数个数大 1 的整数(运行的脚本本身的名称也被当作一个参数)。第二个是包含有参数的数组,其第一个元素为脚本的名称,下标为数字 0($argv[0])。
以上程序中检查了参数的个数是大于 1 个还是小于 1 个。此外如果参数是 --help ,-help ,-h 或 -? 时,打印出帮助信息,并同时动态输出脚本的名称。如果还收到了其它参数,将其显示出来。
如果希望在 Unix 下运行以上脚本,需要使其属性为可执行文件,然后简单的运行 script.php echothis 或 script.php -h。在 Windows 下,可以为此编写一个批处理文件:
Example #2 运行 PHP 命令行脚本的批处理文件(script.bat)
@C:\php\php.exe script.php %1 %2 %3 %
假设将上述程序命名为 script.php,且 CLI 版的 php.exe 文件放置在 c:\php\cli\php.exe,该批处理文件会帮助将附加的参数传给脚本程序:script.bat echothis 或 script.bat -h。