从命令行执行php和从Http Side执行php之间的区别

时间:2010-06-10 16:18:04

标签: php

从命令行执行php和从HTTP执行php有什么区别?他们使用相同的可执行文件,如(php.exe或php-cgi.exe(Apache或IIS))吗?从命令行或HTTP执行时结果是否不同?

7 个答案:

答案 0 :(得分:6)

错误中没有html标记
这是一个php.ini设置(html_errors),但在cli版本中默认为off。

登录到stderr
通常会将错误记录到webservers error.log中,但在cli版本中会将错误写入stderr 这也可以作为php.ini设置(error_log

<强>的php.ini
用于cli版本的php.ini文件可以是不同的文件。这可能会导致一些令人讨厌的错误(突然没有卷曲等等)。

不同的可执行文件
可以安装多个版本的php(php5和php4) 使用which php确定您正在使用的版本。

所有内容都显示为文字
var_dump()在没有<pre>的情况下可读 header('Hello');echo('Hello');

之间没有区别

答案 1 :(得分:2)

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

PHP也意识到它的调用方式不同,并且会调整它的输出以适应这种情况(例如,phpinfo();输出在通过CLI调用时的格式不同。)

答案 2 :(得分:2)

主要区别在于参数传递:从CLI运行,你没有$ _GET,$ _POST,$ _SESSION等;所以参数必须作为命令行参数传递,并使用if $ _SERVER ['argc']和$ _SERVER ['argv']进行访问 注意代码运行的目录和包含路径;并确保你知道你加载了什么php.ini。 输出时,HTML标记不会呈现为标记,而是显示为&lt; H1&GT;等等....特别注意
(PHP_EOL非常有用),多个空格或制表符实际上显示为单个空格的多个空格或制表符。 忘记header()和其他特定于http的函数

答案 3 :(得分:1)

当您从命令行执行php时,您的服务器apache或iis没有任何角色可以玩。您只需使用php4或php5文件夹来执行您的代码。根据可用库和两个文件夹中的php.ini设置的差异,执行可能会有所不同。当使用apache / bin中的apache php.ini运行时。从命令行使用php5或php4文件夹中的php.ini时。

答案 4 :(得分:1)

在大多数情况下,一切都是一样的。差异很大,可能没有填充超级全局变量。看看这些的最佳位置将在php.net上 http://php.net/manual/en/features.commandline.php

答案 5 :(得分:1)

除了已经说过的内容之外,关于文件系统的哪些部分可以访问的特权可能存在差异:通过webserver运行的PHP作为webserver用户运行,命令行中的PHP作为你自己运行。

答案 6 :(得分:0)

虽然这个问题很老,但我想延长@ Bob Fanger有点儿。

从命令行运行php文件非常简单,您只需要记住,在Web服务器或服务器命令行界面上运行文件有一些区别:

  • 没有可用的Cookie

  • 没有$_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(),...),因此您必须确保为该用户提供适当的权限。