【问题标题】:Difference between executing PHP code from the commandline and from the HTTP side从命令行和从 HTTP 端执行 PHP 代码的区别
【发布时间】:2010-06-10 16:18:04
【问题描述】:

从命令行执行 PHP 代码和从 HTTP 执行 PHP 代码有什么区别?

它们是否使用相同的可执行文件,例如(php.exe 或 php-cgi.exe (ApacheIIS))?从命令行或 HTTP 执行时,结果会有所不同吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    错误中没有 HTML 标记

    这是一个 php.ini 设置 (html_errors),但在 CLI 版本中默认为关闭。

    记录到标准错误

    通常错误会记录到 Web 服务器的 error.log 文件中,但在 CLI 版本中,错误会写入 standard error

    这也可用作 php.ini 设置 (error_log)。

    php.ini

    用于 CLI 版本的 php.ini 文件可以是不同的文件。这可能会导致一些令人讨厌的错误(curl 突然不可用等)。

    不同的可执行文件

    可以安装多个版本的 PHP(PHP 8 和 PHP 7)。使用which php 确定您使用的是哪个版本。

    一切都显示为文本

    var_dump() 在没有<pre> 的情况下是可读的。没有 header('Hello');echo('Hello'); 的区别。

    【讨论】:

      【解决方案2】:

      无论是通过 Web 服务器模块还是 CLI 调用 PHP,都使用相同的二进制库(但有时可以配置为使用不同的 ini,这会影响脚本)。它的环境也会有所不同,因此环境变量将不准确。

      PHP 也知道它的调用方式不同,并将调整其输出以适应这种情况(即,phpinfo(); 输出在通过 CLI 调用时将采用不同的格式)。

      【讨论】:

      • 或者他们使用不同的二进制文件。我遇到的大多数实现都有一个完全不同的 cli 和 apache 模块版本,有时甚至不是相同的版本....
      • @Wrikken。出于某种原因,这一定是管理员故意完成的。不管怎样,我现在把它称为binary base
      【解决方案3】:

      主要区别在于参数传递:从 CLI 运行,您没有 $_GET$_POST、$_SESSION 等;所以参数必须作为命令行参数传递并使用 if $_SERVER['argc']$_SERVER['argv'] 访问。

      注意代码运行的目录和包含路径;并确保您知道您已加载的 php.ini 文件。

      输出时,HTML 标记不呈现为标记,而是显示为

      等。特别注意
      (PHP_EOL 非常有用),多个空格或制表符实际上显示为多个空格或制表符,而不是单个空格。

      忘记 headers() 和其他特定于 HTTP 的函数。

      【讨论】:

        【解决方案4】:

        当您从命令行执行 PHP 代码时,您的服务器 ApacheIIS 没有任何作用。

        您只需使用 PHP 4 或 PHP 5 文件夹来执行您的代码。根据两个文件夹中可用库和文件 php.ini 设置的不同,执行可能会有所不同。从 Apache 运行时,使用 apache/bin 文件夹中的文件 php.ini

        从命令行时,使用 php5php4 文件夹中的文件 php.ini

        【讨论】:

          【解决方案5】:

          在大多数情况下,一切都是一样的。最大的区别是超级全局变量可能不会被填充。

          查看这些的最佳位置是 php.net, Using PHP from the command line

          【讨论】:

            【解决方案6】:

            除了已经说过的之外,在访问文件系统的哪些部分方面可能存在权限差异:通过 Web 服务器的 PHP 以 Web 服务器用户身份运行,而命令行中的 PHP 以您自己的身份运行。

            【讨论】:

              【解决方案7】:

              扩展Bob Fanger's answer一点:

              从命令行运行 PHP 文件非常简单。您只需要记住,在 Web 服务器或服务器 CLI 上运行文件存在一些差异:

              • 没有可用的cookies

              • 没有$_GET$_POST$_SESSION 可用 但是您可以使用$argv 来获取作为参数传递给命令的参数。第一个值始终是文件名。

                例如,拿了这个文件:

                <?php
                var_dump($argv);
                ?>
                

              这样称呼:

                  user@ubuntu:$ /usr/bin/php /home/user/file.php foo bar
              

              会给你这个输出:

                  array(4) {
                    [0]=>
                    string(8) "file.php"
                    [1]=>
                    string(3) "foo"
                    [2]=>
                    string(3) "bar"
                  }
              
              • 需要来自服务器根目录的完整文件路径 您需要提供文件的完整路径(例如,include()require()file_get_contents()、...),即使它们可能位于同一文件夹中。

              • 不同的用户/权限设置。 这些文件不是由www-data 用户执行的,而是由您登录到计算机的用户执行的。这会影响所有影响机器文件系统的文件函数调用(例如mkdir()include()、...),因此您必须确保为该用户授予适当的权限。

              【讨论】:

              • 除了这个有用的答案概要之外,$_SERVER 变量也不能用于 CLI 中的脚本,例如 $_SERVER['DOCUMENT_ROOT'] 用于访问脚本中的包含。
              猜你喜欢
              • 2012-03-20
              • 2010-11-18
              • 2012-07-08
              • 1970-01-01
              • 2017-08-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多