1

我需要通过 CLI 运行特定的作业,但我只能选择一个文件 -我不能在其中放置参数。现在,如何让它工作?

我尝试创建 cli_job.php 并通过 CLI 运行它,但它返回主页:

<?php

/* make sure this isn't called from a web browser */
if (isset($_SERVER['REMOTE_ADDR'])) die('CLI-only access.');

/* set the controller/method path */
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] = $_SERVER['QUERY_STRING'] = '/controller/method';
$_SERVER["HTTP_HOST"] = "domain.com";
$argv = array("index.php", "controller", "method");

/* call up the framework */
include(dirname(__FILE__).'/index.php');

谢谢

4

2 回答 2

2

如果你想通过 CLI 运行 CodeIgniter 控制器,你需要通过命令行调用它,而不是通过include.

尝试将您的 CRON 脚本设置为如下内容:

<?php
// Set the options for the CLI script you want to call
$index = 'index.php';
$controller = 'controller';
$method = 'method';
$params = array();

// Execute the CLI script
chdir(dirname(__FILE__));
$passedParams = implode(' ', array_map('escapeshellarg', $params));
exec("php {$index} {$controller} {$method} {$passedParams}");

在此处查看 CodeIgniter 的 CLI 的文档:http: //ellislab.com/codeigniter/user-guide/general/cli.html

注意:这适用于最新的 CodeIgniter 版本(2.1.4),我不确定它是否适用于旧版本。


更新:我正在查看我的旧 CodeIgniter 项目,并找到了一个可能有帮助的文件。

<?php
   $_GET["/controller/method"] = null;
   require "index.php";
?>

我没有对此进行测试,但它可能会起作用。我不确定这个文档,甚至谁制作了这个文件,但它在我的项目中,所以它可能会起作用。


如果一切都失败了,你总是可以这样做:

file_get_contents('http://yourwebsite.com/index.php/controller/method');
于 2013-09-04T14:31:12.970 回答
1

我需要通过扩展 Input 类来指定 $_SERVER['argv'] 变量和假网络访问。

<?php

/* make sure this isn't called from a web browser */
if (isset($_SERVER['REMOTE_ADDR'])) die('CLI-only access.');

$_SERVER["HTTP_HOST"] = "domain.com";
$_SERVER["argv"] = array("index.php", "controller", "module");

require("index.php");



class MY_Input extends CI_Input
{
    function is_cli_request()
    {
        return FALSE;
    }
}
于 2013-09-05T05:03:21.427 回答