Intereting Posts
Как запустить crontab каждые 36 часов Как совместить строки с двойными кавычками, используя php Как определить «светлые» цвета с помощью PHP Контроль доступа на основе ролей Передача переменной GET в php EXEC Как получить путь производного класса от унаследованного метода? Как заменить плохие слова на php? Загрузка обложки в событие через facebook api вызывает исключение Переопределить общедоступный метод в подклассе таким образом, чтобы ограничивать доступ к общедоступным данным, сохраняя при этом доступ к родительскому классу? .htaccess и изменение php-запросов на чистый URL-адрес Почему var_dump показывает имя файла и номер строки? проанализировать XML с помощью SimpleXML, который имеет несколько пространств имен json_encode разреженный массив PHP как массив JSON, а не объект JSON передача php-массива в sql-запрос Передача массивов в качестве параметра url

Длительный фоновый скрипт PHP блокирует другие страницы PHP до тех пор, пока он не будет завершен

Я сделал длинный скрипт на PHP как таковой:

ignore_user_abort(true); set_time_limit(0); 

Он отлично работает в фоновом режиме, даже если я закрываю страницу. Моя проблема в том, что я не могу открыть другие файлы PHP до тех пор, пока этот скрипт не закончит работать в фоновом режиме. Как я могу решить эту проблему?

Related of "Длительный фоновый скрипт PHP блокирует другие страницы PHP до тех пор, пока он не будет завершен"

Когда скрипт PHP использует сеансы, PHP блокирует файл сеанса до завершения скрипта. Запрос страницы, который пытается использовать заблокированный сеанс, блокируется до тех пор, пока файл сеанса не будет выпущен. PHP делает это так, что сеансы остаются в согласованном состоянии. Цитата из PHP ошибка # 31464 :

[2005-01-10 08:13 UTC] derick at php dot net

Это действительно не ошибка, для расширения сеанса необходимо заблокировать файл сеанса, чтобы одновременные обновления не могли повредить файл. Это означает, что все сценарии, использующие один и тот же файл сеанса, должны быть сериализованы. Для повышения производительности вы можете использовать http://php.net/session_write_close, как только вы закончите чтение / настройку переменных сеанса, что приведет к удалению блокировки файла.

Простейшим обходным решением, описанным выше, и здесь также является:

  • вызов session_start()
  • читать / записывать любые переменные сеанса
  • вызов session_write_close()
  • делать длительную обработку

Как упоминалось в комментариях, сеансы являются проблемой – это связано с тем, что файл сеанса заблокирован.

Используйте session_write_close() в своем длинном сценарии, чтобы разблокировать файл сеанса, но обратите внимание, что вы не можете использовать переменные $_SESSION в этом конкретном скрипте впоследствии.