如果从shell运行php,则$ _SERVER和$ _ENV不可用

时间:2014-02-18 21:43:46

标签: environment-variables

我已经设置了一个cron作业,每小时运行一次脚本cron/cron.php 此脚本只是读取一个表来检查在给定时间应运行哪些脚本。 到目前为止没问题。 我刚注意到$_SERVER['DOCUMENT_ROOT']$_SERVER['SERVER_NAME']是空的。与$_ENV['HOSTNAME']

相同

可能是什么原因?我希望我的cron.php便携,所以我正在寻找一个适用于每台服务器的解决方案。

提前感谢任何提示!

1 个答案:

答案 0 :(得分:0)

当运行cron脚本时,它很可能是由php-cli二进制文件而不是网络服务器执行的。

$_SERVER条目由网络服务器设置,这里是quote from $_SERVER page in the PHP manual

  

$_SERVER是一个包含标题,路径和脚本位置等信息的数组。此阵列中的条目由Web服务器创建。

由于您的cron脚本没有涉及Web服务器,因此未设置这些服务器。您可以通过在命令行上执行php来尝试这个:

php -r 'var_dump($_SERVER);'

它将在命令行环境中输出$_SERVER中的所有设置," DOCUMENT_ROOT"最有可能是一个空字符串" SERVER_NAME"根本没有设置。

$_ENV超全局特别包含系统的环境变量,它只是" HOSTNAME"未被cron二进制文件设置为环境变量。

进一步的考虑因素

我通常建议不仅要创建PHP cron脚本(就像使用cron/cron.php一样),还要创建一个调用php脚本的shell脚本。然后在crontab中使用shell脚本。这使您可以轻松地修改环境,而无需经常重新配置crontab或cron.php。然后,您可以在该shell脚本中设置环境变量,以及更改工作目录等。

如果您想让cron.php脚本更具可移植性,请找出注入的环境依赖项(例如您拥有的文档根目录)并制作这些变量,例如:使用变量或参数对象。然后在脚本中创建一个部分,其中填充了这些变量,并且脚本的其余部分可以以注入的方式基于它们运行。这会将配置更改减少到脚本的非常有限的部分,并允许您创建更多可重用的代码。