【问题标题】:Codeigniter 3 CRON via CLI not working通过 CLI 的 Codeigniter 3 CRON 不起作用
【发布时间】:2018-11-13 04:54:44
【问题描述】:

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

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

我已经创建了一个 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';

现在,我可以使用这个术语命令通过 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')

在系统/核心/输入文件中,但已在 CI3 中修改

那么有没有人知道我怎样才能让它工作?

我认为问题在于我的核心文件位于根目录之上,但这就是 CI 建议您为安全而做的事情,而我现在要更改它还有很长的路要走?​​p>

【问题讨论】:

  • 在您的 cli.php 文件中尝试设置 var $_SERVER['REMOTE_ADDR'] = '127.0.0.1' 这不是最好的方法,但它应该可以工作。
  • 好的,这已经消除了错误,但脚本没有运行。正确的 cron 代码是什么?
  • Om 现在收到此错误:消息:session_start():无法发送会话 cookie - 标头已发送
  • 某些东西必须呼应出某些东西,否则某处有一些空白!我会仔细检查以确保您没有输出任何包含空格的内容。
  • 不,没有回声。空格如何输出?

标签: php codeigniter cron


【解决方案1】:

您无需创建特殊文件,也无需任何技巧即可使其正常工作。

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

你的 cron 命令应该是这样的

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

假设你的控制器被命名为“cron”并且你的方法是“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

【讨论】:

  • 安装在ROOT之上,所以我不能只使用index.php?
  • 安装位置无关紧要,如果您的 index.php 文件可以找到所需的控制器和系统文件夹设置正确,它应该可以工作...您使用的是命令行而不是网络服务器处理这个
  • 有多余的斜线,您发送的controller_name method_name 没有斜线(由空格而不是斜线分隔)
  • 好的,谢谢。似乎我从 php 路径中丢失了本地信息,这很烦人。谢谢!
【解决方案2】:

改变这个:

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

【讨论】:

  • 这不起作用,因为此时 CI 功能不可用。核心中没有任何东西被初始化。这只有在他在控制器/模型/库等中使用它时才有效......
  • 不,它的工作就像一个魅力,这个功能只是为了这种检查;)
  • 怎么样?大声笑,如果您创建一个自定义 index.php 文件并将其直接放在顶部,它将永远无法工作,因为它不知道 $this 是什么! $this 用于类和其他对象的范围内,此时没有加载任何类或对象。
猜你喜欢
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多