PHP Conference Nagoya 2025

和其它 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 在命令行模式下,所有来自 printecho 的输出将被立即写到输出端,而不作任何地缓冲操作。如果希望延缓或控制标准输出,仍然可以使用 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 的功能。

添加备注

用户贡献的备注

此页面尚无用户贡献的备注。
To Top