我正在尝试设置一个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建议您为安全做的事情,而且我现在可以远行改变它了吗?
答案 0 :(得分:1)
改变这个:
if (isset($_SERVER['REMOTE_ADDR'])) {
die('Command Line Only!');
}
使用:
if(!$this->input->is_cli_request()){
die('Command Line Only!')
}
你应该检查codeigniter文档
输入类
答案 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