Задания CakePHP 2.X Cron не работают

РЕДАКТИРОВАНИЕ ЗА 2017 Г. В НИЖНЕЙ ЧАСТИ

Я прочитал следующие записи документа:

http://book.cakephp.org/2.0/en/console-and-shells.html

http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html

А также этот вопрос:

Создание заданий Cron в CakePHP 2.x

У меня возникли проблемы с попыткой реализовать две функции задания cron, одна из которых точно такая же, как вопрос о переполнении стека, указанный выше, для отправки тестового электронного письма. Другой, чтобы просто вставить новую строку в мою таблицу "crons". Ни то, ни другое не работает, и я считаю, что именно так я пытаюсь вызвать задания cron. Я не верю, что использую правильный путь.

Консоль/Команда/CronShell.php

class CronShell extends AppShell {
    public $uses = array('Cron');

    public function trigger() {
        $cron = array(
            'Cron' => array(
                'title' => 'Cron Test'
            )
        );

        $this->Cron->create();
        $this->Cron->save($cron);
    }
}

Я настроил CronsController.php с приведенным выше кодом как часть действия индекса. Код отлично работает при доступе через контроллер, поэтому проблема связана с заданием оболочки или cron.

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

***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake cronshell trigger
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake Cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake CronShell trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake cronshell trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake Cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake CronShell trigger

Точно так же я попробовал следующую оболочку для отправки тестового письма

Консоль/Команда/EmailShell.php

App::uses('CakeEmail', 'Network/Email');

class EmailShell extends Shell {

    public function main() {

       $Email = new CakeEmail();
       $Email->template('test', 'default')
           ->emailFormat('html')
           ->to([email protected])
           ->from('[email protected]')
           ->subject('Cron Email')
           ->send();
    } // END MAIN FUNCTION

}

Я снова попробовал следующие команды. Для каждой из этих команд я также попытался удалить имя метода «main» в соответствии с инструкциями документа.

***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake email main
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake emailshell main
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake Email main
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake EmailShell main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake email main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake emailshell main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake Email main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake EmailShell main

РЕДАКТИРОВАНИЕ 2017 Г. – ВСЕ ЕЩЕ НЕ РАБОТАЕТ

Я обновил свой cron до /home/allfan5/public_html/allfans/app/Console/cake.php -app /home/allfan5/public_html/allfans/app/ test action

У меня есть оболочка под названием TestShell и функция под названием «действие». Функция действия совершенно пуста для тестирования (я также пытался использовать функцию, в которой я отправлял сообщения пользователям по электронной почте, но я получал ошибки, поэтому я создал новую оболочку и полностью пустую функцию, и я получаю ту же ошибку).

Ошибка, которую я получаю сейчас,

2017-10-14 21:34:02 Error: Fatal Error (64): Cannot use ‘String’ as class name as it is reserved in [/home/allfan5/public_html/allfans/lib/Cake/Utility/String.php, line 25]
2017-10-14 21:34:02 Error: [FatalErrorException] Cannot use ‘String’ as class name as it is reserved
Stack Trace:
#0 /home/allfan5/public_html/allfans/lib/Cake/Error/ErrorHandler.php(203): ErrorHandler::handleFatalError(64, ‘Cannot use ‘Str…’, ‘/home/allfan5/p…’, 25)
#1 /home/allfan5/public_html/allfans/lib/Cake/Core/App.php(929): ErrorHandler::handleError(64, ‘Cannot use ‘Str…’, ‘/home/allfan5/p…’, 25, Array)
#2 /home/allfan5/public_html/allfans/lib/Cake/Core/App.php(902): App::_checkFatalError()
#3 [internal function]: App::shutdown()
#4 {main}

Я понятия не имею, что может быть причиной этого, так как функция оболочки полностью пуста. Даже действие, когда я пытался отправить пользователям электронное письмо, я скопировал код и запустил его с контроллера, и он работал нормально. Значит, что-то не так с тем, как Cake выполняет или вызывает оболочку.

Я запускаю торт 2.5 на PHP 5.4.


person bowlerae    schedule 18.04.2014    source источник
comment
Вы читали это и это.   -  person skywalker    schedule 18.04.2014
comment
Первое (это) меня смущал путь. Второй (тот) просто не сработал. Кроме того, это было для более старой версии Cake, поэтому не уверен, что пути были правильными. Я пытался настроиться на пути поставщиков Cake 2.X, но все равно не работал. Я хотел бы избежать использования каталога vendors, поскольку, согласно документу, оболочки должны быть помещены в Console/Command.   -  person bowlerae    schedule 18.04.2014
comment
@slywalker, этот документ ужасен :|. Официальная документация не вводит пользователей в заблуждение. думая, что вам нужно что-то особенное для запуска задания cron. bowlerae, если вы можете запустить свою команду в cli, и она не работает через cron - вам нужно будет указать, как/почему - как, за исключением, например, переменные среды, вопреки распространенному мнению, cron ничем не отличается от обычного запуска.   -  person AD7six    schedule 19.04.2014
comment
Скрипт работает не на PHP 5.4, а на PHP 7.x. book.cakephp.org/2.0 /ru/приложения/ | google.com/   -  person ndm    schedule 15.10.2017
comment
@ndm спасибо. Я подозревал, что проблема именно в этом, но не думал, что миграция будет такой простой. Если вы представите официальный ответ, я приму его.   -  person bowlerae    schedule 15.10.2017


Ответы (4)


Мы используем другой способ запуска cron:

в каталоге webroot у меня есть файл с именем corn_dispatcher.php, который является копией файла index.php, но с некоторыми изменениями в конце файла:

App::uses('Dispatcher', 'Routing');
define('CRON_DISPATCHER',true);
$Dispatcher = new Dispatcher();
$Dispatcher->dispatch(new CakeRequest($argv[1]), новый CakeResponse());

Затем у меня есть файл CronjobController.php с функциями, связанными с отдельными кронами. Также добавлена ​​функция beforeFilter с $this->Auth->allow(); (поэтому crons работает без сбоев из-за ограничений ACL), а также удаление макетов и авторендеринга

Затем настройте маршруты к файлу crons.

Наконец, в моем файле crontabs я поместил:

1 6 * * * php -f /path-to-webroot/cron_dispatcher.php /routedUrl

Также несколько вещей, чтобы отметить:

  • вам может потребоваться запустить форму php по полному пути, а не как у меня выше.
  • если файлы создаются, вам может потребоваться запустить crontab от имени пользователя www-data или его эквивалента в вашем дистрибутиве Linux.
  • Кроме того, если у вас есть много вещей в функции beforeFilter AppController.php, вам может потребоваться поставить условие, чтобы увидеть, является ли значение HTTP_HOST пустым, чтобы вы сохраняли работу crons как можно более легкой.

Надеюсь, это поможет.

person SidMalde    schedule 28.04.2014
comment
Это неплохой ответ, но использование диспетчера кукурузы необязательно, вы также можете использовать wget http://domain.com/routedUrl в своем задании cron. В любом случае: я советую преобразовать ваш контроллер cronjob в команды и запускать их как процессы cli (cd app && Console/cake cron etc.). - person AD7six; 28.04.2014
comment
Согласен с AD7six: контроллеры предназначены для обработки HTTP-запросов, а не запуска запланированных задач. Попробуйте перенести логику в модель, если она используется как действием контроллера, так и требуется как cron. - person robmcvey; 28.04.2014

Этот метод является «ванильным», он не требует редактирования или добавления каких-либо php-файлов для отправки ваших заданий Cron, он работает с CakePHP 2.x.

Итак, для CakePHP 2.x используйте это:

Настройки:

  • У вас есть оболочка с именем CustomShell.php, расположенная по адресу /public_html/app/Console/Command/CustomShell.php.

  • Внутри этого CustomShell.php у вас есть несколько функций: functionThis() и functionThat()

Как вызывать эту оболочку и как вызывать каждую функцию по своему усмотрению?

Вы заходите в свою cPanel (или любое другое средство управления, которое вы используете) внутри диспетчера заданий Cron, и это то, что вы должны ввести в команде:

  • Синтаксис выглядит следующим образом:

    cd /home/your_user/public_html/app && Console/cake shell_name function_name

  • Вот как выглядит cmd в моем примере:

    cd /home/your_user/public_html/app && Console/cake custom functionThis

Обратите внимание, что имя функции не CustomShell, а custom. Кроме того, обратите внимание, как я вызываю functionThis(), вы можете оставить это поле пустым, и оно автоматически вызовет вашу функцию main() внутри файла CustomShell.php.

person nullwriter    schedule 02.03.2015

Я запускаю торт 2.5 на PHP 5.4.

Возможно, вы используете php 5.4, но ваш php-cli может быть другой версии, например, может быть php 7, проверьте версию cli. В php 7 вы не можете создать класс с именем String.

* @package       Cake.Utility
*/
class String {
person vasillis    schedule 21.10.2017

Используйте полный путь для сценария оболочки торта (вместо использования cd), затем передайте полный путь к каталогу вашего приложения в соответствии с инструкциями консоли:

Ваш рабочий путь должен совпадать с путем вашего приложения, чтобы изменить свой путь, используйте параметр «-app». Пример: -app относительный/путь/к/myapp или -app /absolute/path/to/myapp

Таким образом, ваша вкладка cron становится:

 * * * * * /home1/bhndbrwn/public_html/cake2/app/Console/cake -app /home1/bhndbrwn/public_html/cake2/app/ cron trigger
person robmcvey    schedule 28.04.2014