Мое Laravel приложение должно выполнить некоторый процесс (на бэкэнде), который может длиться много десятых секунды. Это делается в течение l oop, поэтому у меня есть возможность узнать прогресс в течение длительного процесса. В моем минимальном тесте (в моем проекте Laravel) он длится 10 секунд.
public function massAction(Request $request) {
for ($i = 0; $i < 10; $i++) {
sleep(1);
Log::info("Progress in long running task is " .$i );
}
$output = array(
'success' => 'Whatever'
);
return response()->json($output);
}
Процесс запускается кнопкой в форме. Когда пользователь нажимает кнопку, я хочу, чтобы прогресс отображался на странице, но он отображается только после завершения длительного процесса. Это явление хорошо описано здесь , и я пришел от этого решения , которое я пытался применить (создать маршрут, который возвращает ход).
Пока я оставит клиентский код ajax в стороне. Поскольку маршрут «getProgress» - «get», его можно вызвать вручную во время длительной задачи (которая длится здесь 10 секунд):
public function getProgress() {
$progress = rand(0, 100); // for testing purpose only
Log::info("Progress is " . $progress);
return response()->json(array($progress));
}
Так что, как вы можете видеть, PHP не используется СЕССИЯ, и оба метода независимы. Тем не менее, когда я отправляю форму, а затем go на другой вкладке и запрашиваю URL-адрес getProgress
, его результат все еще приходит после завершения долгосрочной задачи. Вот выдержка из файла журнала Laravel:
[2020-04-16 06:53:49] local.INFO: Progress in long running task is 0
[2020-04-16 06:53:50] local.INFO: Progress in long running task is 1
[2020-04-16 06:53:51] local.INFO: Progress in long running task is 2
[2020-04-16 06:53:52] local.INFO: Progress in long running task is 3
[2020-04-16 06:53:53] local.INFO: Progress in long running task is 4
[2020-04-16 06:53:54] local.INFO: Progress in long running task is 5
[2020-04-16 06:53:55] local.INFO: Progress in long running task is 6
[2020-04-16 06:53:56] local.INFO: Progress in long running task is 7
[2020-04-16 06:53:57] local.INFO: Progress in long running task is 8
[2020-04-16 06:53:58] local.INFO: Progress in long running task is 9
[2020-04-16 06:53:58] local.INFO: Progress in getProgress is 5
Я читал, что PHP SESSION сделает вызовы в очереди (что я действительно испытываю). Но я вообще им не пользуюсь и Laravel Session
. Так что (или что может быть) откладывает вызов на getProgress
в моем Laravel проекте? Или другими словами, что мешает getProgress
немедленно вернуть результат?
Любая помощь приветствуется :-),
Редактировать: Laravel Сервер разработчика односторонний
Я был на самом деле это тестируется на компьютере разработчика через Laravel artisan serve
, который является однопоточным. Неудивительно, что я испытал такое поведение. Тестирование того же процесса на реальном веб-сервере (Apache) сняло все проблемы!