ホームページ  >  記事  >  バックエンド開発  >  PHPのコマンドラインモードの詳しい説明

PHPのコマンドラインモードの詳しい説明

小云云
小云云オリジナル
2018-03-10 09:10:163758ブラウズ

この記事では、主に PHP のコマンド ライン モードについて詳しく説明します。以下は、PHP バイナリ ファイル (つまり、php.exe プログラム) によって提供されるコマンド ライン モード オプションのパラメータです。これらのパラメータは、次の場所で照会できます。 PHP -h コマンドを通じていつでも。

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

CLI SAPI モジュールには、実行する PHP コードを取得するための次の 3 つの異なるメソッドがあります:

Windows 環境では二重引用符を使用し、Linux 環境では、一重引用符を使用してください。引用符で囲んでください。

  1. PHP で指定されたファイルを実行させます。

    php my_script.php 
    php -f  "my_script.php"

    上記のどちらの方法でも (-f パラメーターの有無にかかわらず)、指定された my_script.php ファイルを実行できます。実行するファイルを選択できます。指定する PHP スクリプトには .php 拡張子が必要ではなく、任意のファイル名と拡張子を付けることができます。

  2. コマンドラインから PHP コードを直接実行します。

    php -r "print_r(get_defined_constants());"

    この方法を使用する場合は、シェル変数の置換と引用符の使用に注意してください。

    注: 上記の例をよく読んでください。コードの実行時には開始マーカーと終了マーカーはありません。 -r パラメーターを使用すると、これらのマーカーは不要になり、構文エラーが発生します。

  3. 標準入力 (stdin) 経由で実行する必要がある PHP コードを提供します。

    上記の使用法により、非常に強力な関数が提供され、次の例に示すように、PHP コードを動的に生成し、コマンド ラインからこれらのコードを実行できるようになります。コードを実行する 3 つの方法を同時に使用することはできません。

    すべてのシェル アプリケーションと同様、PHP バイナリ (php.exe ファイル) とそれが実行する PHP スクリプトは一連のパラメータを受け入れることができます。 PHP には、スクリプトに渡される引数の数に制限がありません (シェルにはコマンド ラインの文字数に制限がありますが、通常はその制限を超えることはありません)。スクリプトに渡される引数は、グローバル変数 $argv で使用できます。この配列のインデックスが 0 のメンバーはスクリプトの名前です (PHP コードが標準入力から取得され、-r パラメーターを使用してコマンド ラインから直接実行される場合、この名前は「-」になります)。さらに、グローバル変数 $argc には、$argv 配列内のメンバー変数の数が格納されます (スクリプト プログラムに渡されるパラメーターの数ではありません)。 スクリプトに渡すパラメーターが - 記号で始まらない限り、特に注意を払う必要はありません。 - で始まるパラメータをスクリプトに渡すと、PHP がこれらのパラメータを自分で処理する必要があると判断するため、エラーが発生します。この問題を解決するには、パラメータ リスト区切り文字 -- を使用できます。 PHP がパラメータを解析した後、この記号の後のすべてのパラメータがそのままスクリプトに渡されます。
    $ some_application | some_filter | php | sort -u >final_output.txt

これとは別に、PHP をシェル スクリプトに使用する別の方法があります。スクリプトを作成し、最初の行を #!/usr/bin/php で開始し、その後に PHP 開始タグと終了タグを含む通常の PHP コードを続けて、ファイル属性の正しい実行をセットアップできます。この方法を使用すると、シェル スクリプトや PERL スクリプトのようにファイルを直接実行できます。

#!/usr/bin/phpb90d015f6f436f4ba52f2b2af28de90a
ファイルの名前がtestに変更され、現在のディレクトリに配置されていると仮定すると、次のことができます以下:

# 以下命令将不会运行 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"
}



ご覧のとおり、- で始まる引数をスクリプトに渡すと、スクリプトは引き続き正常に実行されます。

表 23-3. コマンドラインオプション

オプション名 説明
-s

構文を強調表示してソースファイルを表示します。

このパラメーターは、組み込みメカニズムを使用してファイルを解析し、HTML で強調表示されたバージョンを生成し、結果を標準出力に書き込みます。このプロセスでは、ffbe95d20f3893062224282accb13e8f [...] 1cd55414ff5abdfea5dd958e7e547fdd の HTML タグ ブロックが生成されるだけであり、HTML ヘッダーは含まれないことに注意してください。

注: このオプションは、-r パラメーターと一緒に使用することはできません。

-w

は、コメントとスペースを削除したソースコードを表示します。

注: このオプションは、-r パラメーターと一緒に使用することはできません。

-f

指定されたファイル名を解析して実行します。このパラメータはオプションであり、実行する必要があるファイル名を指定するだけで追加する必要はありません。

-v

PHP、PHP SAPI、Zendのバージョン情報を標準出力に書き込みます。例:

$ php -v PHP 4.3.0-dev (cli)、著作権 (c) 1997-2002 The PHP Group Zend Engine v1.3.0、著作権 (c) 1998-2002 Zend Technologies
-c

このパラメータを使用すると、php.ini ファイルが配置されるディレクトリを指定するか、カスタム INI ファイルを直接指定できます。ファイル名は php.ini である必要はありません。例:

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

PHPを対話的に実行します。

-d

このパラメータを使用して、php.ini ファイル内の変数の値を自分で設定します。構文は次のとおりです:

-dconfiguration_directive[=value]

例:

# 値の部分を省略します。指定された構成ディレクティブを「1」に設定します $ php -d 最大実行時間 -r '$foo = ini_get("max_execution_time");' 文字列(1) "1" # 空の値部分を渡すと、設定ディレクティブが "" に設定されます php -d 最大実行時間= -r '$foo = ini_get("max_execution_time");' 文字列(0) "" # 構成ディレクティブは、「=」文字の後に渡されたものに設定されます $ php -d 最大実行時間=20 -r '$foo = ini_get("max_execution_time");' 文字列(2) "20" $php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time");' string(15) "doesntmakesense"
-e

デバッガなどの拡張情報を生成します。

-z

Zend 拡張ライブラリをロードします。ファイル名のみが指定されている場合、PHP はシステムの拡張ライブラリのデフォルト パス (Linux システムでは、通常、このパスは /etc/ld.so.conf によって指定されます) から拡張ライブラリをロードしようとします。ファイル名を絶対パスで指定した場合、拡張ライブラリへのシステムのデフォルトのパスは使用されません。ファイル名が相対パスで指定されている場合、PHP は現在のディレクトリを基準とした相対的な拡張子のロードのみを試みます。

-l

このパラメータは、指定された PHP コードの構文チェックを行う便利な方法を提供します。成功すると、「 で構文エラーが検出されませんでした」という文字列が標準出力に書き込まれ、シェルは値 0 を返します。失敗すると、2334ac29606bf8a170583e4f7533b1f4 の解析エラーが内部パーサー エラー メッセージとともに標準出力に書き込まれ、シェルの戻り値が 255 に設定されます。

このパラメータは致命的なエラー (未定義関数など) を検出しません。致命的なエラーを検出したい場合は、-f パラメータを使用してください。

注: このパラメータは -r と一緒に使用できません。

-m

このパラメータを使用すると、PHP は組み込みおよびロードされた PHP モジュールと Zend モジュールを出力します。$ 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的命令行模式解决办法

以上がPHPのコマンドラインモードの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。