使用CodeIgniter CLI编写cron作业


Writing a cron job using CodeIgniter CLI?

嗨,我在使用CI CLI方式编写cron作业时遇到了一些问题。我的应用程序有一个名为manager.php的控制器名称,因为有一个称为check_status的方法,我将使用一个模型函数获得所有的order_ids。每个order_id行在数据库中都有一个状态文件,该状态文件要么成功,要么失败。

我有一个api,如果我将order_id传递给它,它将告诉订单是否成功交付。但问题来了,我有下面的线在控制器的顶部。

<?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;
    }
}
?>

我像php application/controller/cron_job.php message 一样运行这个控制器窗体CLI

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访问时,这些都经过了充分验证并正常工作。

您需要阅读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版本。

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

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

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

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