0

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

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

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

因此,当我尝试check_status在 CI 中从 CLI 运行方法时,它会给我一个错误说明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 访问时,这些错误已得到充分验证并正常工作。

4

2 回答 2

3

您需要阅读有关通过命令行运行的 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 版本。

于 2013-02-15T18:31:33.960 回答
0

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

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

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

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

于 2013-02-15T05:44:44.253 回答