【问题标题】:Writing a cron job using CodeIgniter CLI?使用 CodeIgniter CLI 编写 cron 作业?
【发布时间】:2013-02-16 02:31:33
【问题描述】:

您好,我在使用CI CLI 方式编写 cron 作业时遇到了一些问题。我的应用程序有一个名为 manager.php 的控制器名称,其中有一个名为 check_status 的方法,我将在其中使用一个模型函数获取所有 order_ids。曾经 order_id 行在数据库中记录了一个成功或失败的状态。

如果我将 order_id 传递给它,我有一个 api,它会告诉我订单是否成功交付。但是这里出现了我在顶部控制器中遇到的问题。

<?php if(! defined('BASEPATH') ) exit("NO Direct Script Access Allowed"); ?>

因此,当我尝试从 CI 中的 CLI 运行方法 check_status 时,它给了我一个错误,指出 NO Direct Script Access Allowed

这就是我上面调用的方法php application/controllers/manager.php check_status

所以我决定像这样创建另一个名为 cron_job.php 的类文件,因为我没有保留上述错误行 "No Direct Script Access Allowed"。我认为当我尝试运行时它现在会提供访问权限,但它不会给出错误甚至输出。

这是我创建的类和方法。

<?php
class Cron_job extends CI_Controller {

    public function message($to = 'World')
    {
        echo "Hello {$to}!".PHP_EOL;
    }
}
?>

我像这样在 CLI 中运行这个控制器 php application/controller/cron_job.php message

Note: I am in ROOT directory.

根本没有输出。所以我尝试了另一种方式,比如php index.php application/controller/cron_job.php message

现在它给了我一个错误,指出Error 404 page not found.

我现在以另一种方式尝试了什么,我在视图文件夹中创建了一个文件,并且我正在调用旧的控制器/方法 url,如下所示。

$result = file_get_contents("http://application_path/controller/method");

echo $result;

现在我得到了我在 manager.php 控制器的方法 check_status 中定义的输出。

但是在上面这行之后出现了另一个问题,我将得到一个包含所有 order_id 的数组输出。

我会将每个 id 发送到 api 以检查状态。如果失败,它将检查是否已交付。如果完成,我需要根据该 order_id 在数据库中更新该状态。但是现在我在视图文件中,是否可以从视图文件中调用模型文件或者有什么方法可以做到这一点。

有什么帮助吗?

注意:任何控制器或任何方法中都没有语法错误,当我使用 url 访问时,它们已经过完全验证并正常工作。

【问题讨论】:

    标签: php api codeigniter cron command-line-interface


    【解决方案1】:

    您需要阅读 Running via the Command Line 上的 CodeIgniter 帮助部分。这很容易。你原来的方法是正确的。但是您不要直接通过路径调用控制器方法,而是 CD 到您的项目根目录,然后以控制器和方法作为参数调用 index.php 文件。

    // This is how you call CI via the command line.
    // Use spaces between index.php and your arguments.
    $ php index.php <controller> <method> [params]
    
    // And in your instance
    $ php index.php manager check_status [param1 param2 param3]
    

    根据您的主机,您可能需要调用为 CLI 编译的 PHP 版本。

    【讨论】:

      【解决方案2】:

      ci 助手会在这方面为您提供帮助。

      1 ) 创建一个助手并在其中创建一个函数,调用您的模型函数

      function getUserDetails($userId = '') {
        $CI = & get_instance(); 
        $getUserDetailsByUserId = $CI->user_model->getUserDetailsByUserId($userId);
        return $getUserDetailsByUserId;
      }
      

      2) 现在你可以在你的视图中调用getUserDetails($userId);

      【讨论】:

      • 嗨,现在我可以从 api 获取状态,现在我想使用该状态在数据库中更新它。我像这样在我的视图中加载了帮助文件 $CI = & get_instance(); $CI->load->helper('generic');然后在 helper update_status($status) 中有一个方法,所以我在加载 helper 后从我的视图文件中调用这个方法,比如 update_status($status)....但是什么也没发生。
      • 在控制器中加载帮助程序。简单地。 $this->load->helper('generic');并调用 update_status($status);可见。
      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2012-01-07
      • 2020-06-11
      • 2011-01-15
      • 2011-11-11
      • 2012-02-23
      相关资源
      最近更新 更多