2016-07-22 3 views
1

Я пишу функцию задания cron, и мой проект построен на CodeIgniter framework. Ниже приведен мой класс контроллера (Cron.php), присутствующий на моем сервере аутентификации.Невозможно вызвать функцию контроллера CodeIgniter из командной строки

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 из командной строки аутентификации сервера, только строка «привет» получает отображается вместо «привет приветствовать».

Но это работает, когда я называю $this->get_log_update() внутри конструктора Data_controller, а также, когда я прямой доступ к URL из браузера

Я сделал что-нибудь глупое или есть большая проблема.

+0

насчет если и попытаться получить его из адресной строки браузера? – siddhesh

+0

@siddhesh Извините, я получаю только «привет» при доступе к URL из панели браузера. – DhiwaTdG

+0

Почему Data_controller простирается от MY_Controller, но контроллер, который работает, выходит из CI_Controller? – chugadie

ответ

0

Возможно, это связано с проблемой 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" на еще, чтобы , если, чтобы получить больше намеков на то, что происходит.

Пожалуйста, дайте мне знать, если это поможет.

EDIT здесь рабочий пример с 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(); 
    } 
} 
} 
+0

'php-cli' не работал, и при попытке' is_cli() 'произошла фатальная ошибка« неопределенная функция ». Я заменил его 'is_cli_request()' в соответствии с Google, что также привело к той же ошибке. Затем я нашел '$ this-> input-> is_cli_request()', который специфичен для CodeIgniter, и он перекликается с «внутри cli». Наконец, я выполнил с «php -cli», и он работал, но отображал только «привет» вместо «привет приветствую». – DhiwaTdG

+0

Это правильный трек. Не могли бы вы разместить весь свой код с помощью $ this-> input-> is_cli_request(), а также вашу последнюю инструкцию cron? Кроме того, убедитесь, что вы используете полный путь к php-cli. – zJorge

+0

@DhiwaTdG просто добавлен пример моего ответа. Я надеюсь, что это работает как ссылка. Не стесняйтесь публиковать свой код, чтобы я мог его преодолеть. – zJorge