2024年PHP日本大会

与其他SAPI的差异

与其他SAPI相比,CLI 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,因为当错误消息中充斥着未解释的HTML标签时,在shell环境中读取它们会非常困难。
    implicit_flush true 在shell环境中,通常希望来自printecho等函数的输出能够立即显示,而不是保存在缓冲区中。尽管如此,仍然可以使用输出缓冲来延迟或处理标准输出。
    max_execution_time 0(无限) shell环境中的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()

  • 为了方便在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