shell cron作业来运行php文件


shell cron job to run a php file

我需要创建一个只有shell访问权限的cron作业。我知道如何使用cPanel,但这是在1和1服务器上,所以我必须使用shell。

根据1和1常见问题解答,我在crontab中添加了一个新的cron作业,但我不确定我做错了什么,因为cron作业根本没有运行。

这是我通常放在cPanel中的内容:

0 8 * * 1 wget 'http://my_www_domain/googlefroogle.php?feed=fy_uy_tp&key=XXXXX3f7d1'

这就是我现在的crontab中的内容:

0 8 * * 1 /usr/local/bin/php /homepages/XX/XXXXXXX/htdocs/googlefroogle.php?feed=fy_uy_tp&key=XXXXX3f7d1

我错过了什么或做错了什么?顺便说一句,如果我在浏览器中手动输入URL,一切都很好,所以我确信脚本是可以的。

据我所知,你可以在任何服务器上的cronjob上使用wget,所以如果你一直这样使用它应该不会有问题。

现在,它不起作用的原因是,您可以通过这种方式将GET params发送到PHP文件。PHP以不同的方式处理命令行。请参阅命令行中的使用PHP。

因此,您必须检查php文件是从url还是从命令行调用的(很容易,请查看php_sapi_name),如果是这样,请使用命令行接口获取参数或在脚本中定义参数。

if (php_sapi_name() == 'cli') {
    if ($argc != 3) {
        die(sprintf('Usage: %s <feed> <key>', $argv[0]));
    }
    $feed = $argv[1];
    $key = $argv[2];
}else{
    $feed = isset($_GET['feed']) ? $_GET['feed'] : null ;
    $key = isset($_GET['key']) ? $_GET['key'] : null ;
}

现在,您必须在您的cronjob:上调用这样的脚本

php -f file.php fy_uy_tp XXXXX3f7d1

它所做的是,如果脚本是从命令行运行的,它会将参数作为变量获取,如果不是,那么它会检查GET参数是否存在并使用它们。

您仍然可以通过shell在crontab管理中使用cPanel"命令"。使用

crontab -l

以列出当前的cron作业。

crontab -e

以编辑crontab。您需要在一些最低限度的安装上手动安装crontab。

尝试

*/0 */8 * * */1 /usr/local/bin/php -f /homepages/XX...

您不能运行具有类似参数的文件,因为shell正在查找名为"file.php?param=value"的文件,而不是"file.php".

如果参数始终相同,则可以在脚本中强制设置它们:

<?php
    $_GET['feed'] = 'fy_uy_tp';
    $_GET['key']  = ...
    $_REQUEST = $_GET;
?>

然后检查脚本是否不需要其他变量,例如$_SERVER['REMOTE_ADDR']或类似的变量。

这些答案都没有帮助我做我需要的事情,所以我最终使用了以下由crontab调用的php文件:

$data = array('feed'=>'fy_uy_tp','key'=>'MY_KEY_HERE');
$url = http_build_query($data, '', '&');
$fullurl = 'http://www.MYSITE.com/googlefroogle.php?'.$url;
$ch = curl_init($fullurl);
$fp = fopen("MY_LOG_FILE.txt", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

万一其他人需要类似的东西。。。另外,请注意,这需要php5,http_build_query在php4-上不起作用