与其他 SAPI 的差异

CLI SAPI 与其他 SAPI 的显著差异

  • CGI SAPI 不同,它不会写入任何头到输出。

    尽管 CGI SAPI 提供了一种抑制 HTTP 头的方法,但在 CLI SAPI 中没有等效的开关来启用它们。

    CLI 默认以静默模式启动,尽管保留了 -q--no-header 开关以保持兼容性,以便可以使用旧的 CGI 脚本。

    它不会将工作目录更改为脚本所在的目录。(保留 -C--no-chdir 开关以保持兼容性)

    纯文本错误消息(没有 HTML 格式化)。

  • 有一些 php.ini 指令被 CLI SAPI 覆盖,因为它们在 shell 环境中没有意义

    覆盖的 php.ini 指令
    指令 CLI SAPI 默认值 注释
    html_errors false 默认为 false,因为在 shell 环境中,当错误消息中包含未解释的 HTML 标签时,它们可能很难阅读。
    implicit_flush true 在 shell 环境中,通常希望输出(例如来自 printecho 和其他类似函数)立即显示,而不是保存在缓冲区中。尽管如此,仍然可以使用 输出缓冲 来延迟或操作标准输出。
    max_execution_time 0(无限) shell 环境中的 PHP 倾向于用于比典型的基于 Web 的脚本范围更广的目的,而且由于这些脚本可能非常耗时,因此将最大执行时间设置为无限。
    register_argc_argv true

    将此设置为 true 表示通过 CLI SAPI 执行的脚本始终可以访问 argc(传递给应用程序的参数数量)和 argv(实际参数的数组)。

    PHP 变量 $argc$argv 在使用 CLI SAPI 时会自动设置为相应的值。这些值也可以在 $_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()

  • 为了便于在 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 行为。

添加备注

用户贡献的备注

此页面没有用户贡献的备注。
To Top