Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung des Befehlszeilenmodus in PHP

Detaillierte Erklärung des Befehlszeilenmodus in PHP

小云云
小云云Original
2018-03-10 09:10:163762Durchsuche

Dieser Artikel enthält hauptsächlich eine detaillierte Erläuterung des Befehlszeilenmodus in PHP. Im Folgenden sind die Parameter der Befehlszeilenmodusoptionen aufgeführt, die von der PHP-Binärdatei (d. h. dem Programm php.exe) bereitgestellt werden Parameter jederzeit über den PHP-Befehl -h ändern.

Usage: php [options] [-f] <file> [args...]
       php [options] -r <code> [args...]
       php [options] [-- args...]
  -s               Display colour syntax highlighted source.
  -w               Display source with stripped comments and whitespace.
  -f <file>        Parse <file>.
  -v               Version number
  -c <path>|<file> Look for php.ini file in this directory
  -a               Run interactively
  -d foo[=bar]     Define INI entry foo with value &#39;bar&#39;
  -e               Generate extended information for debugger/profiler
  -z <file>        Load Zend extension <file>.
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -i               PHP information
  -r <code>        Run PHP <code> without using script tags <?..?>
  -h               This help
 
  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 Methoden, um den PHP-Code zu erhalten, den Sie ausführen möchten:

Versuchen Sie in der Windows-Umgebung, doppelte Anführungszeichen zu verwenden, und in Linux Versuchen Sie, in einer Umgebung doppelte Anführungszeichen zu verwenden. Verwenden Sie zum Vervollständigen einfache Anführungszeichen.

  1. 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 von Ihnen angegebenen PHP-Skripte müssen keine .php-Erweiterung haben;

  2. 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. Beim Ausführen des Codes gibt es keine Start- und Endmarkierungen! Mit dem Parameter -r sind diese Markierungen unnötig und führen zu einem Syntaxfehler.

  3. Stellt den PHP-Code bereit, der über die Standardeingabe (stdin) ausgeführt werden muss.

    Die obige Verwendung stellt uns sehr leistungsstarke Funktionen zur Verfügung, die es uns 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 können 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 Argumente, die an ein Skript übergeben werden (die Shell hat eine Begrenzung hinsichtlich der Anzahl der Zeichen in der Befehlszeile, aber normalerweise werden Sie diese Begrenzung nicht überschreiten). Die an Ihr Skript übergebenen Argumente sind in der globalen Variablen $argv verfügbar. Das nullindizierte Mitglied dieses Arrays ist der Name des Skripts (dieser Name ist „-“, wenn der PHP-Code von der Standardeingabe stammt und direkt über die Befehlszeile mit dem Parameter -r ausgeführt wird). Darüber hinaus speichert die globale Variable $argc die Anzahl der Mitgliedsvariablen im $argv-Array (nicht die Anzahl der an das Skript übergebenen Parameter).

Solange die Parameter, die Sie an Ihr Skript übergeben, nicht mit einem --Symbol beginnen, müssen Sie nicht allzu viel Aufmerksamkeit schenken. Die Übergabe von Parametern, die mit - beginnen, an Ihr Skript führt zu einem Fehler, da PHP davon ausgeht, dass es diese Parameter selbst verarbeiten sollte. Sie können das Parameterlistentrennzeichen verwenden, um dieses Problem zu lösen. Nachdem PHP die Parameter analysiert hat, werden alle Parameter nach diesem Symbol unverändert an Ihr Skript übergeben.

# 以下命令将不会运行 PHP 代码,而只显示 PHP 命令行模式的使用说明:
$ php -r &#39;var_dump($argv);&#39; -h
Usage: php [options] [-f] <file> [args...]
[...]
 
# 以下命令将会把“-h”参数传送给脚本程序,PHP 不会显示命令行模式的使用说明:
$ php -r "var_dump($argv);" -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

Darüber hinaus haben wir eine weitere Möglichkeit, PHP für Shell-Skripte zu verwenden. Sie können ein Skript schreiben und die erste Zeile mit #!/usr/bin/php beginnen, gefolgt vom normalen PHP-Code, der von den PHP-Start- und End-Tags umgeben ist, und dann die korrekte Ausführung für die Dateieigenschaft einrichten. Diese Methode ermöglicht die direkte Ausführung der Datei wie ein Shell-Skript oder PERL-Skript.

#!/usr/bin/php
b064f36456ae336fdf6feef53cd4cadf

Angenommen, die Datei wird in „test“ umbenannt und im aktuellen Verzeichnis abgelegt, können wir Folgendes tun:

$ chmod 755 test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}

Wie Sie sehen können, wird das Skript immer noch korrekt ausgeführt, wenn Sie Parameter, die mit - beginnen, an das Skript übergeben.

Tabelle 23-3. Befehlszeilenoptionen

Optionsname Beschreibung
-s

Quelldateien mit Syntaxhervorhebung anzeigen.

Dieser Parameter verwendet den integrierten Mechanismus, um die Datei zu analysieren, eine HTML-hervorgehobene Version davon zu generieren und das Ergebnis in die Standardausgabe zu schreiben. Bitte beachten Sie, dass dieser Vorgang lediglich einen HTML-Tag-Block von ffbe95d20f3893062224282accb13e8f generiert und keine HTML-Header enthält.

Hinweis: Diese Option kann nicht zusammen mit dem Parameter -r verwendet werden.

-w

Zeigt den Quellcode ohne Kommentare und Leerzeichen an.

Hinweis: Diese Option kann nicht zusammen mit dem Parameter -r verwendet werden.

-f

Parse den angegebenen Dateinamen und führe ihn aus. Dieser Parameter ist optional und kann weggelassen werden. Es muss lediglich der Name der Datei angegeben werden, die ausgeführt werden soll.

-v

Schreiben Sie die Versionsinformationen von PHP, PHP SAPI und Zend in die Standardausgabe. Zum Beispiel:

$ php -v PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
-c

Mit diesem Parameter können Sie eine Platzierung in php.ini angeben Verzeichnis der Datei oder geben Sie direkt eine benutzerdefinierte INI-Datei an, deren Dateiname möglicherweise nicht php.ini ist. Zum Beispiel:

$ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php
-a

PHP interaktiv ausführen.

-d

Verwenden Sie diesen Parameter, um den Wert der Variablen in der php.ini-Datei festzulegen. Die Syntax lautet:

- d Konfigurationsdirektive[=Wert]

Beispiel:

# Durch Weglassen des Wertteils wird die angegebene Konfigurationsanweisung auf „1“ gesetzt. $ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(1) „1“ # Durch die Übergabe eines leeren Wertteils wird die Konfigurationsanweisung auf „“ gesetzt. php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(0) „“ # Die Konfigurationsanweisung wird auf alles gesetzt, was nach dem Zeichen „=“ übergeben wird $ php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(2) „20“ $ php -d max_execution_time=macht keinen Sinn -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(15) „doesntmakesense“
-e

Erweiterte Informationen für Debugger usw. generieren.

-z

Zend-Erweiterungsbibliothek laden. Wenn nur ein Dateiname angegeben wird, versucht PHP, die Erweiterungsbibliothek aus dem Standardpfad der Erweiterungsbibliothek Ihres Systems zu laden (auf Linux-Systemen wird dieser Pfad normalerweise durch /etc/ld.so.conf angegeben). Wenn Sie einen Dateinamen mit einem absoluten Pfad angeben, wird der Standardpfad des Systems zur Erweiterungsbibliothek nicht verwendet. Wenn Sie einen Dateinamen mit einem relativen Pfad angeben, versucht PHP nur, die Erweiterung relativ zum aktuellen Verzeichnis zu laden.

-l

Dieser Parameter bietet eine praktische Möglichkeit zur Syntaxprüfung des angegebenen PHP-Codes. Bei Erfolg wird die Zeichenfolge „Keine Syntaxfehler in 9a2c7908bec70c68979a32cfbab3ed40 erkannt“ in die Standardausgabe geschrieben und die Shell gibt den Wert 0 zurück. Wenn dies fehlschlägt, werden Fehler beim Parsen von 9a2c7908bec70c68979a32cfbab3ed40 zusammen mit internen Parser-Fehlermeldungen in die Standardausgabe geschrieben und der Shell-Rückgabewert wird auf 255 gesetzt.

Dieser Parameter erkennt keine schwerwiegenden Fehler (z. B. eine undefinierte Funktion). Wenn Sie schwerwiegende Fehler erkennen möchten, verwenden Sie bitte den Parameter -f.

Hinweis: Dieser Parameter kann nicht zusammen mit -r verwendet werden.

-m

Mit diesem Parameter druckt PHP die integrierten und geladenen PHP- und Zend-Module aus:

$ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules]
-i 该命令行参数会调用 phpinfo() 函数,并打印出结果。如果 PHP 没有正常工作,我们建议您执行 php -i 命令来查看在信息表格之前或者对应的地方是否有任何错误信息输出。请注意输出的内容为 HTML 格式,因此输出的信息篇幅较大。
-r

使用该参数可以在命令行运行 PHP 代码。您无需加上 PHP 的起始和结束标识符(abcac6319805b2359d7a7018181b8607),否则将会导致语法解析错误。

注:   使用这种形式的 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,或者发邮件到 phpdoc@lists.php.net。

当您试图将外壳的环境变量引入到马或者用反斜线来转义字符时也可能碰到各种各样的问题,请您在使用时注意!

注:            -r 在 CLI SAPI 中有效,在 CGI SAPI 中无效。

-h 使用该参数,您可以得到完整的命令行参数的列表及这些参数作用的简单描述。


PHP 的命令行模式能使得 PHP 脚本能完全独立于 WEB 服务器单独运行。如果您使用 Unix 系统,您需要在您的 PHP 脚本的最前面加上一行特殊的代码,使得它能够被执行,这样系统就能知道用什么样的程序要运行该脚本。在 Windows 平台下您可以将 php.exe 和 .php 文件的双击属性相关联,您也可以编写一个批处理文件来用 PHP 执行脚本。为 Unix 系统增加的第一行代码不会影响该脚本在 Windows 下的运行,因此您也可以用该方法编写跨平台的脚本程序。以下是一个简单的PHP 命令行程序的范例。

例子 23-1. 试图以命令行方式运行的 PHP 脚本(script.php)
#!/usr/bin/php<?phpif ($argc != 2 || in_array($argv[1], array(&#39;--help&#39;, &#39;-help&#39;, &#39;-h&#39;, &#39;-?&#39;))) 
{?>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 下,您可以为此编写一个批处理文件:

@c:\php\cli\php.exe script.php %1 %2 %3 %4

相关推荐:

关于命令行模式的详细介绍

php命令行模式

PHP 5 PHP的命令行模式解决办法

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Befehlszeilenmodus in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn