与其他SAPI相比,CLI SAPI的显著差异
与CGI SAPI不同,不会将任何头信息写入输出。
虽然CGI SAPI提供了一种抑制HTTP头信息的方法,但在CLI SAPI中没有等效的开关来启用它们。
CLI默认以静默模式启动,尽管保留了-q和--no-header开关以保持兼容性,以便可以使用旧的CGI脚本。
它不会将工作目录更改为脚本的目录。(保留-C和--no-chdir开关以保持兼容性)
纯文本错误消息(无HTML格式)。
某些php.ini指令被CLI SAPI覆盖,因为它们在shell环境中没有意义。
指令 | CLI SAPI默认值 | 注释 |
---|---|---|
html_errors | false |
默认为false ,因为当错误消息中充斥着未解释的HTML标签时,在shell环境中读取它们会非常困难。 |
implicit_flush | true |
在shell环境中,通常希望来自print、echo等函数的输出能够立即显示,而不是保存在缓冲区中。尽管如此,仍然可以使用输出缓冲来延迟或处理标准输出。 |
max_execution_time | 0(无限) | shell环境中的PHP往往用于比典型的基于Web的脚本更广泛的目的,并且这些脚本可能运行时间很长,因此最大执行时间被设置为无限。 |
register_argc_argv | true |
将其设置为 使用CLI SAPI时,PHP变量$argc和$argv会自动设置为相应的值。这些值也可以在$_SERVER数组中找到,例如:$_SERVER['argv']。 |
output_buffering | false |
|
max_input_time | false |
PHP CLI不支持GET、POST或文件上传。 |
注意:
这些指令无法从配置文件php.ini或自定义文件(如果指定)中初始化为另一个值。此限制是因为这些值是在解析所有配置文件之后应用的。但是,可以在运行时更改它们的值(尽管对于某些指令来说,这样做并不明智,例如register_argc_argv)。
注意:
建议为命令行脚本设置ignore_user_abort。有关更多信息,请参阅ignore_user_abort()。
为了方便在shell环境中工作,为I/O流定义了许多常量。
CLI SAPI不会将当前目录更改为已执行脚本的目录。
示例 #1 显示与CGI SAPI差异的示例
<?php
// 我们名为test.php的简单测试应用程序
echo getcwd(), "\n";
?>
使用CGI版本时,输出为
$ pwd /tmp $ php -q another_directory/test.php /tmp/another_directory
这清楚地表明PHP将其当前目录更改为已执行脚本的目录。
使用CLI SAPI会产生
$ pwd /tmp $ php -f another_directory/test.php /tmp
这使得在PHP中编写shell工具时具有更大的灵活性。
注意:
CGI SAPI通过从命令行运行时的-C开关支持此CLI SAPI行为。