Я написал задачу Laravel, которая читает данные из базы данных, вызывает сценарий оболочки для обработки данных и сохраняет результаты в базу данных. Задачи ставятся в очередь очень быстро, и в очереди всегда существует несколько задач. Я заметил, что задачи не выполняются одна за другой, но вместо этого пара задач выполняется одновременно. Вообще говоря, это хороший принцип, но кажется, что скрипт оболочки, который я вызываю (кстати, сторонний, и я не могу его изменить), не является поточно-ориентированным и создает проблемы при одновременном вызове несколькими задачами. Когда я выполняю функцию задачи синхронно, как часть моего основного процесса, все работает гладко.
Я хотел бы знать, возможно ли, чтобы очередь Laravel обрабатывала одну задачу за раз, потому что я все еще хочу отделить эту работу от своей основной обработки, но также должен избегать этих ошибок. Я нахожусь на Laravel 5, используя метод очереди синхронизации по умолчанию.
О задачах, выполняемых одновременно, вы пытались добавить withoutOverlapping
?
http://laravel.com/docs/5.1/scheduling#preventing-task-overlaps
Если вы используете закрывающий вызов, вам также необходимо добавить name
Например:
$schedule->call(function () {
DB::table('users')->insert([
'user_id' => '3',
'name' => 'anton'
]);
})->everyHour()
->name('nyanpasu')
->withoutOverlapping();
Других решений пока нет …