PHP8 和其它 SAPI 模块的区别

2023-08-24 15:01 更新

以下为 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

这使得在利用 PHP 编写外壳工具时获得了很大的便利。

注意:可以在命令行运行时给该 CGI SAPI 加上 -C 参数,使其支持 CLI SAPI 的功能。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号