Я случайно обнаружил странную проблему с сеансами PHP.
Когда я запускаю два скрипта PHP, используя ИДЕННЫЙ идентификатор сеанса, второй скрипт застревает до первого завершения.
Я предполагаю, что это потому, что вы пытаетесь открыть тот же файл хранилища сеансов дважды. Но возможно, я не прав.
Вы никогда не поймаете этот эффект при нормальной работе сайта, потому что пользователь обычно не открывал две или более страниц одновременно.
Однако, если вы попытаетесь получить содержимое страницы того же сайта с помощью file_get_contents()
, вы поймете эту проблему.
Кроме того, я копирую свои файлы cookie через контекст, поэтому file_get_contents()
пытается повторно открыть тот же сеанс, который уже открыт в скрипте вызова.
В результате я запустил многопользовательский скрипт (около 5-10 минут), который также запрещает мне открывать любую новую страницу на том же сайте, используя тот же сеанс / логин.
Как я могу решить эту проблему? Вы когда-нибудь видели красивое решение?
Да, это называется «блокировка сеанса» и является нормальным в PHP.
Одним из решений является не использование сеансов, а просто настройка файлов cookie для требуемой постоянной информации.
Еще одно решение – реализовать собственный обработчик сеанса:
http://php.net/manual/en/session.customhandler.php
Подробное пошаговое описание пользовательских обработчиков сеансов MySQL приведено здесь:
Я также нашел довольно простое решение этой проблемы. Мы можем использовать session_write_close();
чтобы разблокировать файл сеанса в сценарии 1, мы можем без каких-либо забот сделать любые curl_exec()
file_get_contents()
, curl_exec()
и после того, как эти операции вернут сеанс session_start()
. Проверено мной, работает как очарование!