Codeigniter 3 CRON通过CLI无法正常工作

时间:2016-05-25 15:16:05

标签: php codeigniter cron

我正在尝试设置一个cron来运行一个codeigniter控制器/方法。

我的应用程序和系统文件等在root之外。

我已经创建了一个cli.php文件作为hack来使其工作,正如codeigniter论坛上的某些人所建议的那样。该文件的内容是:

if (isset($_SERVER['REMOTE_ADDR'])) {
die('Command Line Only!');
}

set_time_limit(0);

$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] = $argv[1];

require dirname(__FILE__) . '/public_html/index.php';

现在,我可以使用这个termical命令通过cli成功运行控制器/方法:

php cli.php cron/reccuring_checks

但我可以让它作为一个cron运行吗?亲爱的,不,我不能,在这一整天。

我尝试过:(以及1000种不同的其他组合)

php cli.php cron reccuring_checks 
/usr/bin/php -q /home/DOMAIN/cli.php cron/reccuring_checks
/usr/bin/php -q /home/DOMAIN/cli.php cron reccuring_checks

我收到以下错误

<p>Severity: Notice</p>
<p>Message:  Undefined index: REMOTE_ADDR</p>
<p>Filename: drivers/Session_files_driver.php</p>
<p>Line Number: 130</p>

我在网上可以找到很多关于这个的帖子通常与CI2和替换方法有关:

$_SERVER['REMOTE_ADDR'] with $this->server('remote_addr')

在system / core / input文件中,但已经在CI3中修改了

所以有人知道我怎么能让它发挥作用吗?

我认为问题在于我的核心文件位于root之上,但这就是CI建议您为安全做的事情,而且我现在可以远行改变它了吗?

2 个答案:

答案 0 :(得分:1)

改变这个:

if (isset($_SERVER['REMOTE_ADDR'])) {
    die('Command Line Only!');
}

使用:

if(!$this->input->is_cli_request()){
    die('Command Line Only!')
}

你应该检查codeigniter文档

输入类

https://www.codeigniter.com/user_guide/libraries/input.html

答案 1 :(得分:1)

您不需要创建特殊文件,也不需要任何类型的黑客来使其正常工作。

简单地说,你创建了一个控制器&amp;通过index.php请求它

您的cron命令应该如下所示

/usr/bin/php -q /path/to/codeigniter/index.php controller_name method

假设您的控制器名为'cron'&amp;你的方法是'reccuring_checks'它会是这样的

/usr/bin/php -q /path/to/codeigniter/index.php cron reccuring_checks

将控制器限制为命令行访问只需如下所示:

class Cron extends CI_Controller {
    public function __construct () {
        parent::__construct();
        // Limit it to CLI requests only using built-in CodeIgniter function
        if ( ! is_cli() ) exit('Only CLI access allowed');
    }
}

如果您的托管服务提供商使用的是cPanel控制面板,那么您的PHP路径应如下所示:

/usr/local/bin/php