Magento 1.9.1 cron_schedule не выбирается вечно


12

Я провел почти 3 дня и не мог понять и заставить Magento Cron обрабатывать запланированные задания. Я использую Magento 1.9.1.0 и недавно заметил, что электронные письма с заказами теперь ставятся в очередь, а не отправляются мгновенно. Я понимаю необходимость, но не могу заставить систему выбирать очереди.

Вот мой взгляд на Cronjob. введите описание изображения здесь

Вот моя командная строка cronjob. введите описание изображения здесь

Вот как задачи создаются в таблице cron_schedule. введите описание изображения здесь

Поскольку записи создаются в таблице cron_schedule, я думаю, что Cron запускается раз в 5 минут. Если я вручную удаляю эти записи через PhpMyAdmin, записи создаются автоматически через некоторое время.

Но статус задач остается «ожидающим» и никогда не завершается. Не уверен, что что-то не так в моей конфигурации или я что-то упустил. Может кто-нибудь, пожалуйста, помогите мне, как заставить запланированное задание выполняться вовремя. Кроме того, почему несколько записей создаются для одного кода работы?

Обновить

Я очистил всю таблицу, и cron создал запланированные задания. Все задания находятся в состоянии ожидания и никогда не выполняются даже в ожидании более 60 минут. Что-то не так в Magento 1.9.1

Обновление 11/02: сегодня я сделал еще один анализ процесса.

Я редактировал cron.php как показано ниже

echo 'iam before mdefault 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
echo 'iam before malways 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
echo 'i returned success';

Я отредактировал класс Mage_Cron_Model_Observer, как показано ниже

public function dispatch($observer) {
  echo 'iam inside dispath';

Насколько я понимаю, когда cron запускает -mdefault, он должен вызвать функцию отправки, и произойдет выполнение. Но то, что произошло, было как показано ниже в выводе cron.

Content-type: text/html

iam before mdefault 1iam before malways 1i returned success

Это означает, что отправка не называется atall ...

Друг друга попробовать

Я вручную изменил переменную, $isShellDisabled = true;и я изменил ниже в cron.php.

if ($isShellDisabled) {
  echo 'before always';
  Mage::dispatchEvent('always');
  echo 'after always';
  Mage::dispatchEvent('default');
  echo 'after default';
} else {
  Mage::dispatchEvent($cronMode);
}

Выход cron для вышеупомянутого как ниже

Content-type: text/html

before alwaysiam inside dispath alwaysafter always

Теперь он вызывает «dispatchAlways», но не «диспетчеризация»

Ни один из ответов не помогает мне. Он никогда не выбирает запланированные задачи. Т.е. когда Cron запускается впервые, он успешно создал задачи в таблице. Но это никогда не выполняет задачу.


Что происходит, когда вы запускаете cron.php из веб-браузера? Это будет пустая страница, но я имею в виду, что происходит с вашими задачами cron?
Шенбриден

Попробуйте использовать скрипт bash: */5 * * * * /bin/sh PATH_TO_PRODUCTION/cron.shесли есть.
Фил Бирни

@seanbreeden, когда я запускаю через URL в браузере, он показывает пустую страницу. С заданиями ничего не произошло .. Я обновил вопрос, создав новый набор заданий ...
Malaiselvan

@PhilB, .sh не имеет никакого значения. Это похоже на ожидающие решения задачи навсегда, но я уверен, что cron работает каждые 5 минут.
Малайзельван

ты пытался очистить cron_scheduleстол? Проверьте, не заполнилось ли оно новыми задачами через час или около того
Сандер Мангель

Ответы:


3

Это была PHP-версия Cron Jobs.

Версия PHP была правильно установлена ​​для сайта, поэтому он работал; однако Cron Jobs работал на сервере PHP 5.3, поэтому я получал ошибки только при запуске Cron. Я обновился до версии 5.5.

Изменена команда Cron:

php /home/mydomainname/public_html/cron.php
to
php55 /home/mydomainname/public_html/cron.php

или в hostgator:

/opt/php55/bin/php /home/mydomainname/public_html/cron.php

в cron.php

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

После этой строки добавьте:

$isShellDisabled = true;

Упоминание о запуске cron.php в определенной версии PHP (в моем случае ea-php70) исправило проблемы, с которыми я столкнулся: запустите php -vв терминале, чтобы увидеть, какую версию PHP использует терминал. В моем случае это было 5,6. Поэтому я должен был заставить использование PHP 7.0, изменив phpна ea-php70в crontab -e. Благодарность!
Даан ван ден Берг

2

ты пытался очистить cron_scheduleстол? Проверьте, заполнено ли оно новыми задачами через час или около того.

Также вы можете использовать Aoe_Scheduler для отключения определенных cronjobs. Посмотрите, может ли какой-то конкретный из них вызвать ошибку, которая останавливает все другие задачи.

То, как Magento cronjobs устанавливают фатальную ошибку в скрипте, приведет к сбою при выполнении всех задач


Спасибо за ответ. Есть ли фатальная ошибка в каком-либо журнале? Я обновил еще несколько выводов по моему делу и обновил то же самое в своем вопросе.
Малайзельван

@seanbreeden: Сегодня я заметил, что когда я запускаю Cron.php через веб-браузер, он отлично работает, выбирая расписания. Это доказывает, что ни в одном скрипте нет фатальной ошибки. Есть идеи, почему cron не работает через crontab?
Малайзельван

2

В качестве первого шага я бы предложил вернуться к настройкам cron Magento по умолчанию:

Magento Cron по умолчанию

Существует проблема с вашими текущими настройками: ваше расписание генерируется каждые 15 минут, но запланировано только на 5 минут, что оставляет 10-минутный промежуток.


Благодарю. Даже после сброса настроек по умолчанию он не работает. При первом запуске он создал все задания в таблице cron_schedule с запланированным временем. Задания никогда не выбираются и остаются в таблице как ожидающие навсегда. Одна вещь, которую я заметил после установки $isShellDisabled = true;и когда я запускаю Cron.php через браузер, задания выбираются, но не через CronTab.
Малайзельван

Эта проблема еще не решена. Будет ли проблема с моим хостинг-провайдером? Я вижу сценарий, запускаемый через равные промежутки времени, но только задания не выбираются. Также это будет проблемой, так как я перешел с 1.8?
Малайзельван

У вашего cronjob достаточно памяти? Попробуйте журналы ошибок, чтобы увидеть, есть ли что-нибудь, что могло бы помочь.
Кристоф на Fooman

эта проблема еще не решена ... Каждый день я ломаю голову. Журналы ошибок? где я могу их увидеть?
Малайзельван

@Malaiselvan для журналов ошибок, пожалуйста, свяжитесь с вашим системным администратором или веб-хостом, поскольку они должны знать местоположение и как получить доступ к журналу ошибок сервера. Кроме того, это может помочь вручную запустить задание cron из командной строки - попробуйте оба варианта php -f cron.phpи ./cron.shпосмотрите, произведут ли они что-нибудь для дальнейшего изучения.
Кристоф в Фуман

1

Та же проблема для меня.

Ошибка "Слишком поздно ...".

После очистки cron_scheduleтаблицы cron.sh перестал работать (больше не планировал).

Работал только после уничтожения всех старых процессов Cron.


В моем случае, когда Cron запускается впервые, он успешно создал задачи в таблице. Но это никогда не выполняет задачу. :-(
Малайзельван

1

У меня такая же проблема. Мой вопрос был часовой пояс конкретным: created_atи scheduled_atстолбцы в cron_scheduleтаблице должна быть UTC + 0, мои записи были UTC + 2.

Чтобы убедиться в этом, вы можете просто установить даты от created_atи scheduled_atдо вчера и дождаться следующего расписания cron.

Надеюсь, что это помогает кому-то!


1

На Bluehost, в cron.sh меняются

 PHP_BIN=`which php`

в

 PHP_BIN="php54s"

По умолчанию на виртуальном хостинге работает PHP 5.2.

Я также должен был изменить cron.php, заменив две $isShellDisabledстроки $isShellDisabled = true;

Чтобы избавиться от предупреждений PHP, я также добавил эти строки перед

$_SERVER['SCRIPT_NAME'] = 

if (empty($_SERVER['SCRIPT_FILENAME'])) $_SERVER['SCRIPT_FILENAME'] = '~/public_html/cron.php';
if (empty($_SERVER['SCRIPT_NAME'])) $_SERVER['SCRIPT_NAME'] = '/cron.php';
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.