【发布时间】:2010-06-10 16:18:04
【问题描述】:
从命令行执行 PHP 代码和从 HTTP 执行 PHP 代码有什么区别?
它们是否使用相同的可执行文件,例如(php.exe 或 php-cgi.exe (Apache 或 IIS))?从命令行或 HTTP 执行时,结果会有所不同吗?
【问题讨论】:
标签: php
从命令行执行 PHP 代码和从 HTTP 执行 PHP 代码有什么区别?
它们是否使用相同的可执行文件,例如(php.exe 或 php-cgi.exe (Apache 或 IIS))?从命令行或 HTTP 执行时,结果会有所不同吗?
【问题讨论】:
标签: php
这是一个 php.ini 设置 (html_errors),但在 CLI 版本中默认为关闭。
通常错误会记录到 Web 服务器的 error.log 文件中,但在 CLI 版本中,错误会写入 standard error。
这也可用作 php.ini 设置 (error_log)。
用于 CLI 版本的 php.ini 文件可以是不同的文件。这可能会导致一些令人讨厌的错误(curl 突然不可用等)。
可以安装多个版本的 PHP(PHP 8 和 PHP 7)。使用which php 确定您使用的是哪个版本。
var_dump() 在没有<pre> 的情况下是可读的。没有
header('Hello'); 和 echo('Hello'); 的区别。
【讨论】:
无论是通过 Web 服务器模块还是 CLI 调用 PHP,都使用相同的二进制库(但有时可以配置为使用不同的 ini,这会影响脚本)。它的环境也会有所不同,因此环境变量将不准确。
PHP 也知道它的调用方式不同,并将调整其输出以适应这种情况(即,phpinfo(); 输出在通过 CLI 调用时将采用不同的格式)。
【讨论】:
binary base
在大多数情况下,一切都是一样的。最大的区别是超级全局变量可能不会被填充。
查看这些的最佳位置是 php.net, Using PHP from the command line
【讨论】:
除了已经说过的之外,在访问文件系统的哪些部分方面可能存在权限差异:通过 Web 服务器的 PHP 以 Web 服务器用户身份运行,而命令行中的 PHP 以您自己的身份运行。
【讨论】:
扩展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'] 用于访问脚本中的包含。