我正在尝试学习如何使用CodeIgniter完成我的第一个cron作业。在过去,似乎使用CI执行此操作的唯一方法是使用wget
命令而不是php
。
然而,CodeIgniter User Guide表示您现在可以从命令行执行此操作,例如通过运行:
$ cd /path/to/project;
$ php index.php controller method
这在我的本地设置上使用终端很有用。但是当我在共享主机上的cPanel的cron部分中使用类似的命令时,该任务只返回index.php
的内容。
我不完全确定cPanel对这个命令做了什么,所以不确定它是否正在使用命令行。
有人可以解释我如何使用CodeIgniter在共享主机上设置cron作业吗?
以下是CodeIgniter用户指南中的示例代码:
tools.php
public function message($to = 'World')
{
echo "Hello {$to}!".PHP_EOL;
}
} ?>
答案 0 :(得分:3)
这将取决于你的主人。如果你不小心,Cron的工作可能真的搞砸了,所以很多共享主机都不允许这样做。您可能需要使用某个虚拟容器(如VPS,virtuozo等)来执行此操作。这不是CodeIgniter问题,而是托管服务提供商问题。先打电话给他们。
答案 1 :(得分:0)
我们解决了以下问题:
这是一个例子(例如,cron.php)
#!/usr/local/bin/php.cli
<?php
DEFINE('CRON_CALL_URL','https://my_server/'); //
DEFINE('CRON_HTTPS_PORT', 443); // port to use during fsocket connetion
DEFINE('CRON_SSL_PREFIX', 'ssl://'); // prefix to be used on the url when using ssl
$current_time = now();
$md5_hash = md5('somevalue'.$current_time);
$url = CRON_CALL_URL.'MYCTRL/MYMETHOD';
$parts=parse_url($url);
//
$parts['query']='md5_hash='.$md5_hash.'&time='.$current_time;
$fp = fsockopen(CRON_SSL_PREFIX.$parts['host'],
isset($parts['port'])?$parts['port']:CRON_HTTPS_PORT,
$errno, $errstr, 30);
if (!$fp) {
} else {
if (!array_key_exists('query', $parts)) $parts['query'] = null;
$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "Content-Type: application/x-www-form-urlencoded\r\n";
$out.= "Content-Length: ".strlen($parts['query'])."\r\n";
$out.= "Connection: Close\r\n\r\n";
if (isset($parts['query'])) $out.= $parts['query'];
fwrite($fp, $out);
fclose($fp);
}
}
?>
注意:确保您的MYCTRL / MYMETHOD功能
ignore_user_abort(true);
当你关闭fsocket连接时,你的脚本仍会运行到最后。
由于各种原因,我们实际上有一堆这些fsockets。如果您需要确保对该控制器/方法的调用来自cron脚本,则需要传递一些额外的哈希值,以便只有cron和脚本知道它。调用脚本后,它可以访问任何codeigniter函数。像魅力一样。
答案 2 :(得分:0)
我在这样的共享主机上设置了100个CI cronjob:创建一个简短的PHP脚本,它调用CI控制器,好像它是一个webbrowser。
因此,script.php包含:
script #! /usr/local/bin/php -f /home/example/public_html/script.php
<?php
get_get_contents('http:example.com/cronjob/');
?>
然后在cPanel中设置你的cronjob来调用script.php 当它运行时,Script.php将调用Codeigniter Cronjob控制器。在那里,您可以使用整个CI框架。
答案 3 :(得分:0)
如果您打算将其称为Web浏览器,为什么不替换cronjob 命令:
wget http://example.com/cronjob/
而不是创建新的或简单的
curl --suppress http://example.com/cronjob/`