PHP8 和其它 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 中的某些设置,因为这些设置在外壳环境下是没有意义的。
设置选项 | CLI SAPI 默认值 | 备注 |
---|---|---|
html_errors | false
|
无意义的 HTML 标记符会使得出错信息很凌乱,所以在外壳下阅读报错信息是十分困难的。因此将该选项的默认值改为 false 。 |
implicit_flush | true
|
在命令行模式下,所有来自 print 和 echo 的输出将被立即写到输出端,而不作任何地缓冲操作。如果希望延缓或控制标准输出,仍然可以使用 output buffering 设置项。 |
max_execution_time | 0(无限值) | 鉴于在外壳环境下使用 PHP 的无穷的可能性,最大运行时间被设置为了无限值。为 web 开发的应用程序可能只需运行几秒钟时间,而外壳应用程序的运行时间可能会长的多。 |
register_argc_argv | true
|
由于该设置为 在使用 CLI SAPI 时,PHP 变量 |
output_buffering | false
|
虽然 php.ini 设置已经硬编码为 |
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
这使得在利用 PHP 编写外壳工具时获得了很大的便利。
注意:可以在命令行运行时给该 CGI SAPI 加上 -C 参数,使其支持 CLI SAPI 的功能。
更多建议: