【问题标题】:Unable to call CodeIgniter controller function from command line无法从命令行调用 CodeIgniter 控制器函数
【发布时间】:2016-07-25 21:45:17
【问题描述】:

我正在编写一个 cron 工作函数,我的项目是基于 CodeIgniter framework 构建的。以下是我的身份验证服务器中的控制器类 (Cron.php)。

class Cron extends CI_Controller {

    public function log_update() {

        $opts = array('http' =>
          array(
              'method' => 'GET',
              'timeout' => 10
          )
      );
      $context = stream_context_create($opts);

      $url = "http://lamp.co.uk/project/data_controller/get_log_update";

        $contents = file_get_contents($url, TRUE, $context);

      var_dump($contents);
    }
 }

以下是我的项目服务器中的Data_controller 类。

class Data_controller extends MY_Controller {

public function __construct() {
  parent::__construct();
  echo "hi ";
}

public function get_log_update() {
  echo "welcome";
}

}

当我从身份验证服务器命令行执行php index.php cron log_update 时,只显示字符串“hi”而不是“hi welcome”。

但是当我在 Data_controller 构造函数中调用 $this->get_log_update() 以及当我直接从浏览器访问 url 时它也有效

我做了什么傻事还是有更大的问题。

【问题讨论】:

  • 如果你尝试从浏览器地址栏获取呢?
  • @siddhesh 抱歉,从浏览器栏访问网址时,我只收到“hi”。
  • 为什么Data_controller是从MY_Controller扩展而来,而工作的控制器是从CI_Controller扩展而来的?

标签: php codeigniter cron


【解决方案1】:

这可能与 CLI 问题有关。

首先看看如果你使用php-cli index.php cron log_update而不是php index.php cron get_log_update()会发生什么(只需添加-cli)。

如果这不起作用,请尝试将您的 echo 包装在 if (is_cli()) 语句上,看看会发生什么。实际上,尝试echo "inside cli" 和另一个echo "not cli"else 到那个if 以获得更多关于正在发生的事情的提示。

如果这有帮助,请告诉我。

这里是一个使用 is_cli 的工作示例:

class Rutinas extends CI_Controller {

function __construct()
{

    parent::__construct();
    $this->load->database();
    // html y url autoloaded

    if (is_cli()) {
        $this->load->model('Trips_model');
        echo "ejecutando cronjob...\r\n";
     } else {
        echo "creo que has perdido el camino...";
     }
}

//redirect if needed, otherwise display the user list
function index()
{
    if (is_cli())
     {
        $viajes_por_archivar = $this->Trips_model->trips_to_update();
        echo "Viajes archivados:\t".$update_past_trips_result;
        echo "\r\n";
        echo "Acuerdos archivados:\t".$update_lost_deals_result;
     } else {
        echo " en el index";
        // $this->output->enable_profiler(TRUE);
        // phpinfo();
     }
}
}

【讨论】:

  • php-cli 不起作用,当尝试is_cli() 时出现致命错误“未定义的函数”。我根据谷歌将其替换为is_cli_request(),这也导致了同样的错误。然后我发现 $this->input->is_cli_request() 是 CodeIgniter 特有的,它与“cli 内部”相呼应。最后我用php -cli 执行,它工作但只显示“hi”而不是“hi welcome”。
  • 这是正确的轨道。您可以使用 $this->input->is_cli_request() 以及您最新的 cron 指令发布您的整个代码吗?另外,请确保您使用的是 php-cli 的完整路径。
  • @DhiwaTdG 只是在我的答案中添加了一个示例。我希望这可以作为参考。请随意发布您的代码,以便我查看。
  • @DhiwaTdG 我只是想知道你是否能用我的例子解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多