Я использую CakePHP 2.0 и пытаюсь настроить cronjob для выполнения метода в контроллере. Я с ума сходил, просматривая различные учебники и случайные сайты, чтобы узнать, смогу ли я найти решение.
Ошибка, которую я получаю, такова:
Undefined variable: argc [APP/webroot/cron_dispatcher.php, line 83
Вот дно файла cron_dispatcher.php в моем каталоге app / webroot / .
if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) { trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR); } if (isset($_GET['url']) && $_GET['url'] === 'favicon.ico') { return; } else { define('CRON_DISPATCHER',true); if($argc >= 2) { $Dispatcher= new Dispatcher(); $Dispatcher->dispatch($argv[1]); } }
Я не могу найти, где определены эти переменные ($ argv и $ argc). Они не определены нигде в самом файле dispatcher.php. Я искал Google безрезультатно. Я не уверен на 100%, как работает Диспетчер, но любая помощь была бы весьма признательна. Благодарю.
== ОБНОВЛЕНИЕ Общий хостинг GoDaddy не позволяет вам изменять настройки argc argv.
Если кто-то заинтересован,
В новом CakePHP 2.0.5 вы будете индексировать index.php в папке webroot:
Скопируйте этот файл и назовите его cron_dispatcher.php и поместите его в тот же каталог (webroot)
Вы найдете этот код в самом низу:
$Dispatcher = new Dispatcher(); $Dispatcher->dispatch(new CakeRequest(), new CakeResponse(array('charset' => Configure::read('App.encoding'))));
измените нижнюю часть на
define('CRON_DISPATCHER',true); $Dispatcher = new Dispatcher(); $Dispatcher->dispatch(new CakeRequest($argv[1]), new CakeResponse(array('charset' => Configure::read('App.encoding'))));
Здесь вы делаете две вещи: устанавливаете CRON_DISPATCHER в true и передаете переменные среды ($ argv [1]).
В своем контроллере добавьте эту строку, прежде чем делать что-либо еще:
if (!defined('CRON_DISPATCHER')) { $this->redirect('/'); exit(); }
Это гарантирует, что люди, идущие на сайт yoursite.com/controller/cronaction, не смогут запустить ваш скрипт.
В файле htaccess в webroot добавьте следующее:
<Files "cron_dispatcher.php"> Order deny,allow Deny from all </Files>
Это гарантирует, что poeple, идущий на yoursite.com/cron_dispatcher.php, не сможет его запустить.
Теперь настройте работу cron, используя что-то вроде команды:
php /home/yoursite/public_html/cakephp/app/webroot/cron_dispatcher.php /controller/cronjobaction
$ argc и $ argv – это переменные среды, заданные в CLI.
Возможно, вам нужно будет проверить свой параметр PHP на register_argc_argv (который НЕ должен быть отключен)
Я не уверен, как вы создали свою работу cron, но как насчет чего-то вроде этого:
*/10 * * * * wget -O - -q "http://localhost/url/to/your/controller/action"
Разумеется, лучшей идеей может быть создание оболочки для торта и ее запуск в зависимости от ваших потребностей.
Существует и никогда не было необходимости создавать диспетчер cron. Единственное, что требуется для использования приложения CakePHP через cron, – это создать консольную команду и вызвать ее:
*/5 * * * * cd /full/path/to/app && Console/cake myshell myparam
В какой-то момент в прошлом в книге были некоторые плохие советы, которые с тех пор были исправлены .