執行 PHP 檔案

執行 PHP 檔案

CLI SAPI 有三種不同的方法執行 PHP 程式碼:

  1. 讓 PHP 執行指定檔案。

    $ php my_script.php
    
    $ php -f my_script.php
    

    以上兩種方法(使用或不使用 -f 參數)都能夠執行給定的 my_script.php 檔案。注意,沒有限制可以執行哪種檔案, 特別是檔名也不必用 .php 作為副檔名。

  2. 在命令列中直接傳遞 PHP 程式碼執行。

    $ php -r 'print_r(get_defined_constants());'
    

    必須特別注意 shell 變數的替代及引號的使用。

    注意:

    請仔細閱讀以上範例,它們沒有開始和結束識別符號!加上 -r 參數后不需要這些標記符,並且加上它們還會導致語法錯誤。

  3. 通過標準輸入(stdin)提供需要執行的 PHP 程式碼。

    這為動態建立 PHP 程式碼並通過二進制檔案執行提供了強大的能力,就像下面(虛構的)例子展示的一樣:

    $ some_application | some_filter | php | sort -u > final_output.txt
    
以上三種執行程式碼的方法不能混合使用。

和所有的 shell 應用程式一樣,PHP 的二進制檔案及其 PHP 指令碼能夠接受一系列的參數。PHP 沒有限制傳送給指令碼的參數的個數( shell 對傳遞的字元數有限制,但通常都不會超過該限制)。傳遞給指令碼的參數可在全域性陣列 $argv 中獲取。第一個索引(零)始終包含從命令列中呼叫的指令碼名稱。注意在命令列內使用 -r 執行 PHP 程式碼時, $argv[0] 的值將是 "Standard input code"; 在 PHP 7.2.0 之前是破折號(-)。如果程式碼是通過來自 STDIN 的管道執行的,同樣如此。

另外,第二個全域性變數 $argc 包含 $argv 陣列中元素的個數(而不是傳遞給指令碼的參數個數)。

只要傳送給指令碼的參數不是以 - 字元開頭,就無需過多的注意什麼。向指令碼傳遞以 - 開頭的參數會導致錯誤,因為 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"
}

然而,在 Unix 系統中還有一個將 PHP 用於 shell 指令碼的方法:寫個指令碼,第一行以 #!/usr/bin/php 為開頭 (如果 PHP CLI 二進制檔案路徑不一樣,則可以指定為任意實際的路徑)。檔案的剩餘部分應該包含通用的 PHP 開始標籤、正常的 PHP 程式碼、PHP 結束標籤。一旦設定正確的檔案執行屬性(例如 chmod +x test),指令碼就像其他 shell/perl 指令碼一樣可以執行。

示例 #1 PHP 指令碼作為 shell 指令碼執行

#!/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 可執行檔案可用於執行完全獨立於 web 伺服器的 PHP 指令碼。在 Unix 系統上,需要在 PHP 指令碼的第一行指定 #!(或者說 「shebang」)以便系統可以自動判斷用哪個程式執行指令碼。 在 Windows 平臺上可以使用雙擊副檔名是.php的檔案與 php.exe 相關聯,也可以編寫一個批處理檔案使用 PHP 執行指令碼。為 Unix 系統增加的指定 shebang 的第一行程式碼不會影響 Windows (它也是 PHP 註釋的格式),因此也可以用該方法編寫跨平臺的程式。以下是編寫的一個簡單 PHP 命令列程式的示例。

示例 #2 試圖以命令列方式執行的 PHP 指令碼(script.php)

#!/usr/bin/php
<?php

if ($argc != || 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];
}
?>

在以上指令碼中,用包含 Unix shebang 的第一行程式碼來指明該檔案應該由 PHP 來執行。這裡使用 CLI 版本執行,因此不會輸出 HTTP 頭。

程式首先檢查是否有需要的參數(除了指令碼名,因為它也會被計算進來)。如果沒有參數或者參數是 --help-help-h-?,將會列印出幫助訊息, 在命令列上使用 $argv[0] 動態輸出指令碼名稱。否則參數將按照接收的方式進行準確回顯。

如果在 Unix 下執行以上指令碼,它必須有可執行許可權,並簡單的以 script.php echothis 或者 script.php -h 方式呼叫。在 Windows 下,可以為此類任務編寫與以下內容類似的批處理檔案:

示例 #3 執行 PHP 命令列指令碼的批處理檔案(script.bat)

@echo OFF
"C:\php\php.exe" script.php %*

假設將上述程式名為 script.php,且 CLI 版的 php.exe 位於 C:\php\php.exe, 該批處理檔案將會執行並傳遞所有追加選項: script.bat echothis 或者 script.bat -h

參閱 Readline 擴充套件文件獲取更多函式,以用於 PHP 中增強命令列應用程式。

在 Windows 上, PHP 可以配置為無需提供 C:\php\php.exe 或者 副檔名為 .php 的檔案執行,如 PHP 在 Microsoft Windows 下的命令列方式中所述。

注意:

在 Windows 上,推薦在真實使用者賬戶下執行 PHP。在網路服務下執行某些操作時將會失敗, 因為「帳戶名與安全標識間無任何對映完成」。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *