如何通过CRON运行CodeIgniter文件?

16

我过去尝试过以下方法:

<?php
set_time_limit(0);
$_SERVER['PATH_INFO'] = 'cron/controller/index';
$_SERVER['REQUEST_URI'] = 'cron/controller/index';
require_once('index.php');
?>

将此代码放入CodeIgniter安装目录中的一个文件中,将其命名为cron.php,然后通过以下方式调用:

php /home/[username]/public_html/my_project/cron.php
如果我在浏览器中输入cron.php的URL,它可以完美地运行,但是无论何时都通过CRON运行它,我都会收到404错误。将以下代码放入CodeIgniter的show_404()函数中。
function show_404($page = '')
{
   print_r($_SERVER);
   echo "\n\n";
   die ($page);
}

结果是将以下输出通过电子邮件发送给我:

Array
(
   [SHELL] => /bin/sh
   [MAILTO] => me@gmail.com
   [USER] => [me]
   [PATH] => /usr/bin:/bin
   [PWD] => /home/[me]
   [SHLVL] => 1
   [HOME] => /home/[me]
   [LOGNAME] => [me]
   [_] => /usr/bin/php
   [PHP_SELF] =>
   [REQUEST_TIME] => 1266479641
   [argv] => Array
       (
           [0] => /home/[me]/public_html/my_project/cron.php
       )

   [argc] => 1
   [PATH_INFO] => cron/controller/index
   [REQUEST_URI] => cron/controllers/index
)


home/[me]

这里我用 [me] 代替了我的真实用户名。

有什么想法吗?


请查看此帖子 - https://glennstovall.com/writing-cron-job-in-codeigniter/。如果您开始每分钟执行wget或curl,则运行非常频繁的调用可能会变得繁琐。一般的语法是<path to php eg. /usr/bin/php> <path to codeigniter project>/index.php <controller name>/<function_name>例如php /home/<your_domain>/public_html/<your_subdomain>/index.php cron/clear_unpaid_requests - CanonicalBear
6个回答

22
最简单的通过CodeIgniter运行cron的方法是使得一个cron URL在你的应用程序中可用。
然后通过wget调用它。
wget -O - -q -t 1 http://www.example.com/cron/run

在控制器中,您可以使用日志来确保定时任务不会过于频繁地运行,例如如果Google机器人误触发了它。

第二种方法是使用lynx。

/usr/local/bin/lynx -source http://www.example.com/cron/run

使用w命令时,我需要复制星号吗?我应该将整个命令都按照您给出的方式复制吗? - Ali
星号代表 cron 运行的时间。我认为我引用的那些是每小时运行 cron 的。 - Jon Winstanley
很好。我使用cpanel界面添加cron作业,所以不需要星号。干杯 - Ali
4
如果您受到Apache超时的限制,那么不建议使用CLI。如果您有一个需要长时间运行的脚本,请使用引导程序。 - galchen
1
这种方法的问题是现在您的脚本可以从Web访问。通常,通过cron运行的东西是私有脚本。查看$this->input->is_cli_request()。您应该能够使用php $HOME/path/to/script/index.php controller method param调用您的cron脚本。 - Andrew Brown

5
您可能还希望添加 --spider 以忽略响应。这样可以防止请求超时:
wget -O - -q -t 1 --spider http://www.example.com/cron/run

4

你可能还想看看这个:计划任务引导程序

这是一个简单的引导程序文件,您可以使用它直接从命令行运行CodeIgniter控制器。这是一种非常简单而优雅的解决方案,用于将CI控制器用于cron作业。它还支持日志记录。


3
这里有一篇关于如何在命令行上运行CodeIgniter的维基文章,但这对需要通过终端与用户进行交互的应用程序更有用(也有一个库可以实现这个功能)。 http://codeigniter.com/wiki/CI_on_the_command_line/ 使用此方法的一个好处是,您可以通过以下方式保护代码免受用户或机器人的执行:与使用wget不同。
if(!empty($_SERVER['HTTP_HOST']))
{
     show_error('Shove off hax0r!');
}

2

0

使用php-cli代替php
例如:

/usr/bin/php-cli  /home/CPANEL_USER/public_html/index.php cronJobs deleteNotifications 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接