和其它 SAPI 模块的区别
以下为 CLI SAPI 和其它 SAPI 模块相比的显著区别:
-
与 CGI SAPI 不同,其输出没有任何头信息。
尽管 CGI SAPI 提供了取消 HTTP 头信息的方法,但在 CLI SAPI 中并不存在类似的方法以开启 HTTP 头信息的输出。
CLI 默认以安静模式开始,但为了保证兼容性,-q 和 --no-header 参数为了向后兼容仍然保留,使得可以使用旧的 CGI 脚本。
在运行时,不会把工作目录改为脚本的当前目录(可以使用 -C 和 --no-chdir 参数来兼容 CGI 模式)。
出错时输出纯文本的错误信息(非 HTML 格式)。
-
CLI SAPI 强制覆盖了 php.ini 中的某些设置,因为这些设置在外壳环境下是没有意义的。
覆盖 php.ini 设置选项 设置选项 CLI SAPI 默认值 备注 html_errors false
无意义的 HTML 标记符会使得出错信息很凌乱,所以在外壳下阅读报错信息是十分困难的。因此将该选项的默认值改为 false
。implicit_flush true
在命令行模式下,所有来自 print
和echo
的输出将被立即写到输出端,而不作任何地缓冲操作。如果希望延缓或控制标准输出,仍然可以使用 output buffering 设置项。max_execution_time 0(无限值) 鉴于在外壳环境下使用 PHP 的无穷的可能性,最大运行时间被设置为了无限值。为 web 开发的应用程序可能只需运行几秒钟时间,而外壳应用程序的运行时间可能会长的多。 register_argc_argv true
由于该设置为
true
,将总是可以在 CLI SAPI 中访问到 argc(传送给应用程序参数的个数)和 argv(包含有实际参数的数组)。在使用 CLI SAPI 时,PHP 变量
$argc
和$argv
已被注册并且设定了对应的值。随时可以通过 $_SERVER 数组 来访问它们,例如:$_SERVER['argv']output_buffering false
虽然 php.ini 设置已经硬编码为
false
, 输出缓冲控制函数仍然有效。max_input_time false
PHP CLI 不支持 GET、POST、文件上传。
注意:
这些设置无法在设置文件 php.ini 或任何指定的其它文件中被初始化为其它值。这些默认值被限制在所有其它的设置文件被解析后改变。 不过,它们的值可以在程序运行的过程中被改变 (尽管对于该运行过程来说,这些设置项是没有意义的,例如 register_argc_argv)。
注意:
推荐命令行脚本设置 ignore_user_abort。 更多信息参见 ignore_user_abort()。
-
为了减轻外壳环境下的工作,我们为 I/O 流 定义了一系列常量。
-
CLI SAPI 不会将当前目录改为已运行的脚本所在的目录。
以下范例显示了本模块与 CGI SAPI 模块之间的不同:
<?php
// 名为 test.php 的简单测试程序
echo getcwd(), "\n";
?>在使用
CGI
版本时,其输出为$ pwd /tmp $ php-cgi -f another_directory/test.php /tmp/another_directory
明显可以看到 PHP 将当前目录改成了刚刚运行过的脚本所在的目录。
使用 CLI SAPI 模式,得到:
$ pwd /tmp $ php -q another_directory/test.php /tmp
注意:
可以在命令行运行时给该 CGI SAPI 加上 -C 参数,使其支持 CLI SAPI 的功能。

User Contributed Notes
备份地址:http://www.lvesu.com/blog/php/features.commandline.differences.php