嗨,我在使用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);
。