Браузер блокирует во время дорогостоящего процесса на стороне сервера от асинхронного запроса - PullRequest
0 голосов
/ 06 июня 2018

Итак, у меня довольно дорогой и сложный PHP-процесс, который делает его выполнение длительным, давайте назовем его функцией «дорогой_процесс ()».

У меня есть интерфейс, который при нажатии кнопки вызывает ajaxзапрос к PHP-скрипту, который, в свою очередь, инициирует "дорогой_процесс ()".Вот код JavaScript:

$('#run_expensive_process_button').click( function(){

  var url = "initiate_expensive_process.php";

  $.ajax({
    url: url
  });

});

И код initiate_exорого_process.php:

<?php
  session_start();    

  run_expensive_process();
?>

Просто и тривиально.Теперь проблема заключается в том, что во время работы cost_process () браузер теряет способность перемещаться по домену.Если я обновляю окно браузера, оно зависает бесконечно, пока процесс продолжается.Если я перенаправлю на другой URL в том же домене, то же самое.Это происходит во всех браузерах.Однако, если я перезапущу браузер (закрою и открою новое окно, а не вкладку), навигация будет работать нормально, даже если все еще запущено cost_process ().

Я проверил сетевой трафик и запрос HTTPto initiate_exорого_process.php не получает ответ во время выполнения дорогого_процесса (), но я предполагаю, что это не должно блокировать браузер, учитывая асинхронный характер запроса ..

Еще одна вещь, котораяЯ считаю актуальным.Эта ситуация происходит на сервере реплики.На моей локальной машине, где я запускаю WAMP и тот же исходный код, этого не происходит, т. Е. Во время работы дорогой_процесс () я все еще могу перемещаться по домену хостинга без необходимости перезапуска браузера.Похоже, это свидетельствует о какой-то проблеме конфигурации сервера, но я не уверен, что могу исключить другие возможные причины.

Кто-нибудь знает, что может быть причиной этого или что можно сделать, чтобы выяснить,источник проблемы?

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Скорее всего, другие сценарии PHP также являются переменными сеанса.Только один процесс сценария может получить доступ к сеансу одновременно;если второй сценарий попытается получить доступ к сеансу, пока первый сценарий еще выполняется, он будет заблокирован, пока не завершится первый сценарий.

Первый сценарий может разблокировать сеанс, вызвав session_write_close(), когда это будет выполнено с использованиемсессия.См. Если вызов PHP-страницы через ajax, который требует времени для запуска / возврата (и устанавливает переменные сеанса), будет ли второй вызов ajax увидеть эти изменения сеанса? для получения дополнительной информации о том, как вы можете создать скрипт.

0 голосов
/ 06 июня 2018

Интересно, может ли это быть из-за ajax.Javascript выполняется на стороне клиента.Может быть, вы могли бы рассмотреть строковый вызов JSON вместо ajax?

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