2014
Mar
19

有一天底層的 PHP Core Library 發現一個 Bug ,有工程師為了 Command Line 測試方便,加入了一行判定 Command Line Mode 的程式,但是他卻是這樣寫的。

php cli
  1. if ( isset($_SERVER['argc']) {
  2. //cli mode
  3. execute('xxx');
  4. }

這個寫法是有問題的,當我使用 Browser 打開頁面,執行 Apache PHP Module 時,$_SERVER['argc'] 的值會等於 0 ,然後程式就進入了 Command Line Mode,於是 Bug 就出現了 ...

後來我查詢了 PHP 官網的正確寫法,應該是要使用 PHP_SAPI 的變數,如果你是用 Apache PHP module 執行 PHP , PHP_SAPI 的值會等於 apache2handler,而使用 php index.php 這種 Command Line 執行時, PHP_SAPI 的值會等於 cli

Example
  1. <?php
  2. if (PHP_SAPI != "cli") {
  3. exit;
  4. }

另一種PHP Command line mode 判定方式。

Example
  1. <?php
  2. $cli_mode = false;
  3. if ( isset($_SERVER['argc']) && $_SERVER['argc']>=1 ) {
  4. $cli_mode = true;
  5. }
  6. ?>

參考資料


回應 (Leave a comment)