Функция PHP замораживает весь сайт, пока он работает - PullRequest
0 голосов
/ 07 июня 2018

У меня есть метод контроллера в Laravel, который замораживает весь сайт во время его работы - например, при попытке загрузить любую страницу во время работы просто зависает, пока не завершится выполнение функции.

Поэтому я попытался разбить егочтобы увидеть, какая часть была проблемой, я заподозрил блокировку базы данных и т. д., но в конце концов я попробовал что-то новое и пришел к неожиданному выводу - что происходит в функции, не имеет значения!

Я заменил все содержимоеметода с sleep(30); и в течение 30 секунд весь сайт был недоступен.

Так что я предполагаю, что некоторые ресурсы распределяются по приложению, и все остальные страницы должны ждать, пока этот методвыполнить перед запуском.

Мой вопрос: почему это происходит, и как мне выяснить, какие именно проблемные ресурсы есть?

1 Ответ

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

Если это происходит только для одного и того же сеанса, это, вероятно, будет блокировка сеанса.

Каждый раз, когда вы запускаете session_start () (или когда для PHP session.auto_start установлено значение true, это будетсделать это автоматически в каждом скрипте PHP), ОС заблокирует файл сеанса.В большинстве реализаций используется flock, который также используется для предотвращения перекрывающихся cronjobs или других блокировок файлов в Linux.

Эта блокировка сохраняется для файла до тех пор, пока сценарий не завершится или блокировка не будет намеренно снята(подробнее об этом ниже).Это действует как блокировка чтения и записи: каждая попытка чтения сеанса должна ждать, пока не будет снята блокировка.

Сама по себе блокировка не является проблемой.Это мера предосторожности, предотвращающая запись в файл сеанса из нескольких мест, возможно, повреждение данных или удаление предыдущих данных.

Это становится проблемой, когда второй параллельный скрипт PHP пытается получить доступ к одному и тому же сеансу PHP.

Больше информации здесь: https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/

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