Laravel 5: вызов маршрута «получить прогресс» откладывается до конца длительного процесса - PullRequest
0 голосов
/ 15 апреля 2020

Мое 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) сняло все проблемы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...