Сначала мне нужно понять, как работает Magento cron.
Я знаю, как cron работает на linux, используя crontab -e
.
Я знаю, что мне нужно настроить cron.php Magento для периодического запуска
Но когда я определяю cron в файле конфигурации magento, как они совпадают, они должны быть запущены?
Потому что, если установить мой cron.php для запуска каждые 15 минут ( 0,15,30,45 * * * *
), и у меня есть Magento cron <schedule><cron_expr>10 * * * *</cron_expr></schedule>
например.
Как это будет соответствовать / работать?
Кстати, как я могу проверить, работает ли мой cron, не дожидаясь долгого времени?
Пункт входа cron в Magento – это скрипт cron.php
в вашем корне Magento. Вам нужно будет настроить запись crontab операционной системы, чтобы этот сценарий, который вы, похоже, уже сделали.
Как работает cron
Каждый раз, cron.php
скрипт cron.php
попадает, происходят три вещи:
config.xml
файлы config.xml
для записей jobs
<config><crontab>...</crontab></config>
, читая их элементы cron_expr
для подробного cron_expr
того, как часто их следует запускать. Затем Magento заполняет таблицу расписания cron заданиями, которые должны выполняться в будущем, а также временными отметками, когда они должны запускаться. Степень в будущем, которую Magento делает, настраивается администратором. Дублированные прогоны?
Вы поднимаете интересный момент. Что произойдет, если у вас запланирован 10-минутный cron в Magento, но cron.php
гарантированно только каждые 15 минут. Похоже, что Magento будет запускать ваши задания Magento дважды, в некоторых случаях:
Я только прочитал код, и вот что происходит. Лучшим способом узнать, конечно, было бы запустить его и выяснить. Если вы хотите избежать этой проблемы, в большинстве случаев увеличьте cron.php
выполнения cron.php
каждые 5 минут, что и мы делаем.
Тестирование вашего кода
Если вы хотите проверить, действительно ли ваш cron работает без ожидания возраста, установите cron_expr
для выполнения каждую минуту или очистите таблицу расписания cron, а затем дважды нажмите cron.php
(один раз для создания расписания и снова для запуска задания ).
Если вы хотите просто проверить, работает ли ваша модель, вы можете настроить тестовый скрипт (описанный в https://www.nicksays.co.uk/testing-magent-modules ) и запустить его.
Ваш вопрос вызвал сообщение в блоге: https://www.nicksays.co.uk/dissecting-the-magento-cron-system 🙂
добавив их в нижнюю часть cron.php, он будет выписывать cron.php.log при выполнении с дат-временем
try { Mage::getConfig()->init()->loadEventObservers('crontab'); Mage::app()->addEventArea('crontab'); Mage::dispatchEvent('default'); $log = fopen(__FILE__.'.log', 'a'); fwrite($log, date("Ymd H:i:s").PHP_EOL); fclose($log); } catch (Exception $e) { Mage::printException($e); }
поtry { Mage::getConfig()->init()->loadEventObservers('crontab'); Mage::app()->addEventArea('crontab'); Mage::dispatchEvent('default'); $log = fopen(__FILE__.'.log', 'a'); fwrite($log, date("Ymd H:i:s").PHP_EOL); fclose($log); } catch (Exception $e) { Mage::printException($e); }
Во второй половине вашего вопроса … как узнать, работает ли его.
Вот что я сделал. Я добавил следующий код в конце файла cron.php. Это обновляет простой журнал под названием «cronlog.txt» каждый раз, когда вызывается запрос cron.php.
Поэтому, если у меня есть сомнения в работе cron, я могу просто взглянуть на этот файл и увидеть последнюю дату и время работы cron.php.
try { $myFile = "cronlog.txt"; $fh = fopen($myFile, 'w'); $stringData = date('l jS \of FY h:i:s A'); fwrite($fh, $stringData); fclose($fh); } catch (Exception $e) { Mage::printException($e); }
Если вы работаете в GNU / Linux, вы можете проверить /var/log/syslog
и отфильтровать cronjobs с помощью grep
. Чтобы просмотреть список всех запущенных cronjob, введите grep 'cron' /var/log/syslog
.
Чтобы проверить работу cron или нет, вы можете просто написать Mage::log('cron working', null, 'cron.log');
в конце файла cron.php.
Если cron работает, он создаст файл cron.log в вашем базовом каталоге.