有没有办法实例化Code​​Igniter并从外部类调用控制器内的函数?

时间:2014-05-13 07:05:26

标签: php codeigniter cron

我正在创建一个每隔几分钟运行一次的cron作业,它将从数据库数据中读取以查看需要调用哪个函数并根据数据执行操作,但是一半的crons是用codeigniter编写的,另一半是用native编写的PHP。

有没有办法做到这一点?我一直在谷歌搜索,但是anwser。我想出来的是,这是不可能的。我尝试更改目录,而不是在codeigniter中包含或要求index.php,其中函数是我需要调用的。

在执行此操作时,如果我的类是用本机php编写的,它会返回一些没有意义的错误,如果我纠正这些错误,我会说codeigniter的一半系统函数将会消失。如果它能够发挥作用仍然是一个问题。

如果我的类是用codeigniter编写的,当我包含index.php时,它就会中断。没有错误没有响应或它说已经定义了“环境”变量。因此,我一直在寻找一种方法来从配置文件中取消定义这些变量,或者将它们覆盖为null或空字符串,但没有任何效果。

如果您有任何想法,我们将不胜感激。

我在php中看到了一个关于某些cron作业的问题question link,其中用户@michal kralik回答了我正在做的一般数据库和一个调用其他crons的cron类(coould使用帮助那也是。

顺便忘了提到使用curl和exec不起作用,因为在我们的服务器上,他们有时会无缘无故地停止工作。

更新1:

这是我的班级经过这么多次尝试之后:

 class Unicron extends MY_Controller {       

        public $config;

        function __construct() {
            parent::__construct();
        }

        public function init(){
            $config['base_url'] = "http://localhost/test";
            define('EXT_CALL', true); // Added EXT_CALL constant to mark external calls
            $_GET['controller/method'] = ''; // add pair to $_GET with call route as key

            $current = getcwd(); // Save current directory path
            chdir('C:/inetpub/wwwroot/test/'); // change directory to CI_INSTALLATION

            include_once 'index.php'; // Add index.php (CI) to script
            define('BASEPATH', 'C:/inetpub/wwwroot/test/system/');

            $this->load->library("../../application/controllers/controller.php");
            $job = new $this->controller->Class();
            $isDone = $job->exportExcel(somekey);
            echo $isDone;

            $CI =& get_instance(); // Get instance of CI

            $CI->exportExcel('baseparts', 'exportExcel');
            // FOR STATIC CALLING!!
            //$CI->method('controller','method'); 
            //replace controller and method with call route
            // eg: $CI->list('welcome','list'); If calling welcome/list route.

            //$OUT->_display(); // to display output. (quick one)

            // Or if you need output in variable,
            //$output = $CI->load->view('VIEW_NAME',array(),TRUE); 
            //To call any specific view file (bit slow)
            // You can pass variables in array. View file will pick those as it works in CI

           chdir($current); // Change back to current directory
           echo $current;
    }

我尝试定义BASEPATH,它没有定义它,也没有覆盖以前的值。 在其他codeigniter的index.php中我放了:

  if(!defined('ENVIRONMENT')) 
     define('ENVIRONMENT', 'development');

这样我就解决了环境已经设置错误的问题。

这是我发现并组合在一起的一些东西,希望它可以工作但是当我通过命令行调用它时它什么也没有显示(甚至尝试回应任何地方的任何东西,没有)。

1 个答案:

答案 0 :(得分:0)

这可能是一个长注释而不是答案,因为提供的代码需要大量工作才能使其有用。

运行'codeigniter'的多个实例 - 从codeigniter执行。

使用PHP中的'通过shell执行程序'。每个实例都在自己的环境中运行。

现有一些优秀的答案:

默认情况下,PHP命令'shell'等待命令完成...

732832/php-exec-vs-system-vs-passthru

然而,我们经常想“发射并忘记”,所以这个答案非常有用......

1019867/is-there-a-way-to-use-shell-exec-without-waiting-for-the-command-to-complete

我所做的就是用这个节目作为如何使用'codeigniter'来做这个的例子。该示例是用户手册中的“Hello World”cli示例。 ci的版本是2.1.14。我之前没有用过'ci'。

它已在Windows XP上测试并运行'PHP 5.3.18'。

除了通常的'Hello World'示例之外,我还使用了一个使用'sleep'总共20秒的命令示例,以便我们可以很容易地看到'ci'实例彼此分开执行。

示例:

<?php
class Tools extends CI_Controller {

    // the usual 'hello world' program
    public function message($to = 'World')
    {
       echo "Hello {$to}!".PHP_EOL;
    }

    // so you can see that the processes are independant and 'standalone'
    // run for 20 seconds and show progress every second.
    public function waitMessage($to = 'World')
    {
        $countDown = 20;
        while ($countDown >= 0) {
            echo "Hello {$to}! - ending in {$countDown} seconds".PHP_EOL;
            sleep(1);
            $countDown--;
        }
    }
}

'ci'代码运行'ci'代码...

<?php
class Runtools extends CI_Controller {
    /*
     * Executing background processes from PHP on Windows
     * http://www.somacon.com/p395.php
     */

    // spawn a process and do not wait for it to complete
    public function runci_nowait($controller, $method, $param)
    {
       $runit  = "php index.php {$controller} {$method} {$param}" ;
       pclose(popen("start \"{$controller} {$method}\" {$runit}", "r"));
       return;
    }

    // spawn a process and wait for the output.
    public function runci_wait($controller, $method, $param)
    {
       $runit  = "php index.php {$controller} {$method} {$param}";
       $output = exec("{$runit}");
       echo $output;
    }

}

如何从cli运行它们......

要运行“ci”'nowait'例程,请执行:

php index.php runtools runci_nowait <controller> <method> <param>

其中参数是您要运行的ci控制器。另一个为'runci_wait'。{/ p>

'Hello World:'等待输出' - (ci:tools message)

codeigniter>php index.php runtools runci_wait tools message ryan3
Hello ryan3!

waitMessage - '不要等待输出' - (ci:tools waitMessage)

codeigniter>php index.php runtools runci_nowait tools waitMessage ryan1

codeigniter>php index.php runtools runci_nowait tools waitMessage ryan2

这些将启动并运行两个独立的“ci”流程。