我已经设置了一个cron作业,每小时运行一次脚本cron/cron.php
此脚本只是读取一个表来检查在给定时间应运行哪些脚本。
到目前为止没问题。
我刚注意到$_SERVER['DOCUMENT_ROOT']
和$_SERVER['SERVER_NAME']
是空的。与$_ENV['HOSTNAME']
可能是什么原因?我希望我的cron.php
便携,所以我正在寻找一个适用于每台服务器的解决方案。
提前感谢任何提示!
答案 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
脚本更具可移植性,请找出注入的环境依赖项(例如您拥有的文档根目录)并制作这些变量,例如:使用变量或参数对象。然后在脚本中创建一个部分,其中填充了这些变量,并且脚本的其余部分可以以注入的方式基于它们运行。这会将配置更改减少到脚本的非常有限的部分,并允许您创建更多可重用的代码。