CLI SAPI 与其他 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 ,因为在 shell 环境中,当错误消息中包含未解释的 HTML 标签时,它们可能很难阅读。 |
implicit_flush | true |
在 shell 环境中,通常希望输出(例如来自 print、echo 和其他类似函数)立即显示,而不是保存在缓冲区中。尽管如此,仍然可以使用 输出缓冲 来延迟或操作标准输出。 |
max_execution_time | 0(无限) | shell 环境中的 PHP 倾向于用于比典型的基于 Web 的脚本范围更广的目的,而且由于这些脚本可能非常耗时,因此将最大执行时间设置为无限。 |
register_argc_argv | true |
将此设置为 PHP 变量 $argc 和 $argv 在使用 CLI SAPI 时会自动设置为相应的值。这些值也可以在 $_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 行为。