我需要创建一个只有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-上不起作用