我想要运行一个cron工作。我的应用程序是用PHP和Mysql开发的。
在浏览器中,如果我在编码中使用$_SERVER[HTTP_HOST]
,它可以正常工作。但是,如果我在cron作业中使用相同的东西,它会给出错误。
任何机构都可以建议解决这个问题吗?
答案 0 :(得分:17)
$_SERVER['HTTP_HOST']
,不会通过HTTP访问该文件。
您将需要对主机进行硬编码或通过命令行参数传递它,并通过$_SERVER['argv']
阵列访问它。
答案 1 :(得分:6)
当在命令行上执行php时,$_SERVER['HTTP_HOST']
(当然)不可用。
您可以使用@
符号来抑制错误,或使用构造线稍微谨慎一些:
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI';
答案 2 :(得分:5)
如前所述,当您通过php-cli运行php时,$ _SERVER不存在。
虽然,有一个选项可以在php-cgi中运行你的cron'd脚本,你将拥有$ _SERVER。如果您卷曲到本地Web服务器,则将填充$ _SERVER。
$ cat /etc/cron.daily/mydailyphpwork
/usr/bin/curl http://domain.tld/path/to/cron-script.php &> /dev/null
然而,我认为你应该坚持使用TimWolla或DerVO提出的解决方案,除非你真的需要这种行为。
优点:
缺点:
答案 3 :(得分:5)
尝试使用curl运行cron作业..它将填充$ _SERVER ['HTTP_HOST']。
linux上的语法就像
curl http://yourdomain/yourfile.php
答案 4 :(得分:2)
如果$_SERVER[HTTP_HOST]
为空,您可以对其进行硬编码,或者您可以执行其他检查。
答案 5 :(得分:1)
将硬编码的args添加到crontab中并没有帮助,因为我需要它对不同的环境敏感
所以> = PHP 5.3.0你可以使用gethostname()
答案 6 :(得分:0)
令我惊讶的是,没有人提到只为另一个文件中的_SERVER数组定义任何必需值,然后仅包含它的选项。这是我发现从cli运行通常基于cgi的php脚本以进行快速测试/调试的最快方法。
例如,文件cron_server_wrapper.php
:
<?php
$_SERVER['SERVER_NAME'] = "localhost";
$_SERVER['HTTP_HOST'] = "localhost";
$_SERVER['REMOVE_ADDR'] = "10.20.30.40";
$_SERVER['DOCUMENT_ROOT'] = "/";
$_SERVER['HTTP_REFERER'] = "/crontab-foo";
然后运行:
/usr/bin/php -B "require 'path/to/cron_server_wrapper.php'" -E "require 'my_php_cron_script.php';" < /dev/null