Любая помощь по этому вопросу будет очень признательна.
У меня есть 15 задач, выполняемых в определенное время. Важно, чтобы они запускались в это время, поскольку они создают свои данные на основе первой запущенной задачи cron. Вот пример:
$schedule->command( 'task:build one' )->cron( '2/5 * * * *' );
$schedule->command( 'task:build two' )->cron( '3/15 * * * *' );
$schedule->command( 'task:build three' )->cron( '3 * * * *' );
$schedule->command( 'task:build four' )->cron( '4 */12 * * *' );
...
Используя task: two в качестве примера, проблема выглядит следующим образом:
task: two использует результаты в базе данных, сгенерированные задачей: one, и сохраняет их в другой таблице. Таблица, используемая задачей: одна задача ВСЕГДА читается другими задачами и никогда не записывается. Так:
задача: один работает и занимает меньше минуты. задача: два начинается через минуту.
В редких случаях (может быть, до 8 раз в неделю, кажется случайным) задача: два откладываются так долго, что задача: одному удается запустить снова (через 5 минут) и добавить дополнительную строку в свою таблицу, поэтому к задаче времени: two получает данные, которых у него больше, чем нужно.
Из моих собственных исследований:
Нет проблем с тупиком sql, поскольку каждая задача записывает только в таблицу, специфичную для себя, и я не вижу никаких журналов ошибок mysql.
База данных составляет ок. 5GIG, работающий на дешевом сервере Digital Ocean за 20 долларов.
Из 15 задач кажется, что некоторые задачи выполняются больше, чем другие, а некоторые никогда не выполняются.
Я не разработчик, и я пытаюсь определить, является ли это проблемой Laravel, возможно, из-за моей плохой реализации или проблемы с сервером.
Я надеюсь, что это достаточно хорошо описывает проблему, чтобы получить помощь, но если нет, дайте мне знать, какая дополнительная информация вам нужна.
Никаких ошибок PHP. Все исключения отправляются в Slack, так что я знаю, а не получаю. Да, все задачи завершаются, и у меня есть однострочный журнал для каждой задачи с отметкой времени их завершения. Я также вижу из базы данных created_at, что они задерживаются.
@fubar Загрузка сервера в это время тоже кажется нормальной. Из 15 задач примерно 4 кажутся выполненными. И это кажется случайным. Они не в одно и то же время.
Вы переименовали задачи для этого вопроса, или это действительно одна команда task: build, которая принимает параметры (один, два, три, четыре)?
Да, это одна команда, которая каждый раз использует разные таблицы.






Вы можете использовать функцию laravel, называемую перекрытием задач, с помощью команды
$schedule->command('emails:send')->withoutOverlapping(10);
Чтобы узнать больше, перейдите по ссылке https://laravel.com/docs/5.5/scheduling#preventing-task-overlaps.
Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавить контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление о том, что это такое и почему оно есть, а затем процитируйте наиболее релевантную часть страницы, на которую вы ссылаетесь. если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены.
withoutOverlapping () здесь не поможет, но спасибо.
Есть ошибки PHP? Есть ли у вас журнал вывода каждого шага ваших задач, чтобы увидеть, где он замедляется? Всегда ли завершается вторая задача, даже если она выполняется медленно? Какова нагрузка на сервер в то время? Может ли это замедлить его? В чем разница между второй задачей и всеми остальными задачами, из-за которых только одна может иногда выполняться медленно?