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)