Работа CodeIgniter Cron на виртуальном хостинге? - PullRequest
4 голосов
/ 01 декабря 2011

Я пытаюсь научиться делать свою первую работу cron с использованием CodeIgniter.В прошлом казалось, что единственный способ сделать это с помощью CI - это использовать команду wget вместо php.

Однако в CodeIgniter User Guide говорится, что теперьВы можете сделать это из командной строки, например, запустив:

$ cd /path/to/project;
$ php index.php controller method

Это прекрасно работает при использовании терминала на моей локальной установке.Но когда я использую аналогичную команду в разделе cron cPanel на моем общем хостинге, задача просто возвращает содержимое index.php.

Я не совсем уверен, что cPanel делает с этой командой, поэтому не уверенотносительно того, использует ли он вообще командную строку.

Может кто-нибудь объяснить, как я могу настроить задачу cron на виртуальном хостинге с использованием CodeIgniter, пожалуйста?

Вот пример кода из руководства пользователя CodeIgniter:

tools.php

public function message($to = 'World')
{
    echo "Hello {$to}!".PHP_EOL;
}

}?>

Ответы [ 4 ]

3 голосов
/ 01 декабря 2011

Это будет зависеть от вашего хоста. Задания Cron могут действительно испортить ситуацию, если вы не будете осторожны, поэтому многие хосты общего доступа этого не позволяют Для этого вам, вероятно, понадобится виртуальный контейнер (например, VPS, virtuozo и т. Д.) Это не проблема CodeIgniter, а проблема хостинг-провайдера. Сначала позвони им.

0 голосов
/ 21 ноября 2015

Если вы собираетесь называть это как веб-браузер, почему бы не заменить cronjob команда с:

wget http://example.com/cronjob/

вместо создания чего-то нового или просто

curl --suppress http://example.com/cronjob/`
0 голосов
/ 22 мая 2013

Я установил cronjob CI на разделяемом хостинге следующим образом: создайте короткий скрипт php, который вызывает контроллер CI, как если бы он был веб-браузером.

Итак, script.php содержит это:

      script #! /usr/local/bin/php -f /home/example/public_html/script.php 

  <?php
     get_get_contents('http:example.com/cronjob/');     
  ?>

Затем установите cronjob в cPanel для вызова script.php. При запуске Script.php вызовет контроллер Codeigniter Cronjob. В вашем распоряжении вся инфраструктура CI.

0 голосов
/ 01 декабря 2011

Мы решили эту проблему следующим образом:

  1. Настройка обычного php-файла, запланированного cron. Ничего общего с кодигнитером пока нет
  2. Внутри него вы можете сделать запрос fsocket или curl для выполнения вашего обычного вызова CodeIgniter, как вы делаете это из Интернета.

Вот пример (скажем, cron.php)

#!/usr/local/bin/php.cli
<?php
DEFINE('CRON_CALL_URL','https://my_server/'); // 

DEFINE('CRON_HTTPS_PORT', 443); // port to use during fsocket connetion
DEFINE('CRON_SSL_PREFIX', 'ssl://'); // prefix to be used on the url when using ssl
$current_time = now();
$md5_hash = md5('somevalue'.$current_time);
        $url = CRON_CALL_URL.'MYCTRL/MYMETHOD'; 
        $parts=parse_url($url);
        // 
        $parts['query']='md5_hash='.$md5_hash.'&time='.$current_time;    
        $fp = fsockopen(CRON_SSL_PREFIX.$parts['host'],
            isset($parts['port'])?$parts['port']:CRON_HTTPS_PORT,
            $errno, $errstr, 30);

        if (!$fp) {
        } else {

            if (!array_key_exists('query', $parts)) $parts['query'] = null;
            $out = "POST ".$parts['path']." HTTP/1.1\r\n";
            $out.= "Host: ".$parts['host']."\r\n";
            $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out.= "Content-Length: ".strlen($parts['query'])."\r\n";
            $out.= "Connection: Close\r\n\r\n";
            if (isset($parts['query'])) $out.= $parts['query'];

            fwrite($fp, $out);
            fclose($fp);
        }
}
?>

ПРИМЕЧАНИЕ. Убедитесь, что в функции MYCTRL / MYMETHOD установлена ​​

ignore_user_abort(true);

таким образом, когда ваше fsocket-соединение закрыто, ваш скрипт все равно будет работать до конца.

На самом деле у нас есть куча этих fsockets по разным причинам. Если вам нужно убедиться, что вызов этого контроллера / метода поступил из скрипта cron, вам нужно передать некоторые дополнительные значения хеша, чтобы его знали только cron и скрипт. Как только скрипт вызван, он получает доступ к любым функциям codeigniter. Работает как шарм.

...