首頁  >  文章  >  後端開發  >  PHP中的命令列模式詳解

PHP中的命令列模式詳解

小云云
小云云原創
2018-03-10 09:10:163754瀏覽

本文主要和大家分享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 程式碼:

在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 程式碼並透過命令列運行這些程式碼:

    $ some_application | some_filter | php | sort -u >final_output.txt

 

以上三種執行程式碼的方法不能同時使用。

和所有的外殼應用程式一樣,PHP 的二進位(php.exe 檔案)及其執行的 PHP 腳本能夠接受一系列的參數。 PHP 沒有限制傳送給腳本程式的參數的個數(外殼程式對命令列的字元數有限制,但您通常不會超過該限制)。傳遞給您腳本的參數可在全域變數 $argv 中取得。在該數組中下標為零的成員為腳本的名稱(當 PHP 程式碼來自標準輸入獲直接用 -r 參數以命令列方式運行時,該名稱為“-”)。另外,全域變數 $argc 存有 $argv 陣列中成員變數的個數(而非傳送給腳本程式的參數的個數)。

只要您傳送給您腳本的參數不是以 - 符號開頭,您就無需過多的注意什麼。傳送以 - 開頭的參數到您的腳本會導致錯誤,因為 PHP 會認為應該由它本身來處理這些參數。您可以用參數清單分隔符號 -- 來解決這個問題。在 PHP 解析完參數後,符號後所有的參數將會被原樣傳送給您的腳本程式。

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

#除此之外,我們還有另一個方法將 PHP 用於外殼腳本。您可以在寫一個腳本,並在第一行以#!/usr/bin/php 開頭,在其後加上以PHP 開始和結尾標記符包含的正常的PHP 程式碼,然後為該檔案設定正確的執行屬性。該方法可以使得該檔案能夠像外殼腳本或 PERL 腳本一樣直接執行。

#!/usr/bin/php
bfcbb2e39d0dbc2bcbd8f6a0554395e6

#假設改檔名為test 並被放置在目前目錄下,我們可以做如下操作:

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

正如您所看到的,當您向該腳本傳送以 - 開頭的參數時,腳本仍然能夠正常運作。

表格23-3.命令列選項

-d-e-z-l-m
#選項名稱 描述
-s

顯示有語法高亮色彩的原始檔。

此參數使用內建機制來解析檔案並為其產生一個 HTML 高亮版本並將結果寫入標準輸出。請注意該過程所做的只是產生了一個 ffbe95d20f3893062224282accb13e8f [...] 1cd55414ff5abdfea5dd958e7e547fdd 的 HTML 標記符塊,並不包含任何的 HTML 頭。

註:   此選項不能和 -r 參數同時使用。

-w

顯示除去了註解和空格的原始碼。

註:   此選項不能和 -r 參數同時使用。

-f

解析並執行給定的檔案名稱。此參數為可選參數且可不加,僅指明需要運行的檔案名稱即可。

-v

將 PHP、PHP SAPI 及 Zend 的版本資訊寫入的標準輸出。例如:

$ 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

用該參數,您可以指定一個放置php.ini 文件的目錄,或直接指定一個自訂的INI 文件,其文件名稱可以不是php.ini。例如:

$ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php
#-a ## 互動地執行 PHP。

使用此參數可以自行設定php.ini 檔案中設定變數的值,其語法為:

-d configuration_directive[=value]

範例:

# Ommiting the value part will set the given configuration directive to "1" $ php -d max_execution_time       -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(1) "1" # Passing an empty value part will set the configuration directive to "" php -d max_execution_time=       -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(0) "" # The configuration directive will be set to anything passed after the '=' character $  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"

為偵錯器等產生擴充資訊。

載入 Zend 擴充功能庫。如果僅給定一個檔名,PHP 將試圖從您系統擴充庫的預設路徑(在 Linux 系統下,該路徑通常由 /etc/ld.so.conf 指定)載入該擴充庫。如果您用一個絕對路徑指定檔案名,則系統的擴充庫預設路徑將不會被使用。如果使用相對路徑指定的檔案名,PHP 則僅試圖載入相對於目前目錄的擴充庫。

此參數提供了對指定 PHP 程式碼進行語法檢查的方便的方法。如果成功,則向標準輸出寫入 No syntax errors detected in 2334ac29606bf8a170583e4f7533b1f4 字串,並且外殼傳回值為 0。如果失敗,則 Errors parsing        2334ac29606bf8a170583e4f7533b1f4 以及內部解析器錯誤訊息會一起寫入標準輸出,同時外殼回傳值將別設為 255。

此參數將無法檢查致命錯誤(如未定義函數),如果您希望偵測之名錯誤,請使用 -f 參數。

註:   此參數不能和 -r 一同使用。

使用此參數,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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn