У меня возникла проблема с идентичными симптомами, за исключением того, был ли файл сеанса удалён или нет, не имеет значения (и может быть для вас тоже - есть ли у вас доказательства того, что удаление файла сеанса связано с flock
?).
В моем случае, это было состояние гонки для доступа к одной и той же сессии файла между двумя сценариями:
/page1.php
выполняет хорошо, когда загружен. Он включает javascript, который выполняет XMLHttpRequest до /background.php
.
- При обращении к
/background.php
он запускает readfile(http://remote.url)
, что является несуществующим URL-адресом.
- При переходе на
/page2.php
сценарий застопорился. Строка показывает flock(89, LOCK_EX
, а lsof указывает, что она ожидает доступа для чтения/записи в файле сеанса.
В этом случае, как и /page2.php
/background.php
оба ждут на той же сессии файл, но тот не смог сделать это, потому что была задержана в ожидании readfile()
отключалось. Я получил это в php_error_log
:
PHP Warning: readfile(http://remote.url): failed to open stream: Connection timed out in […]/background.php on line […]
Таким образом, проблема была с совершенно иным сценарием, чем воспринимаемый виновник.
Вы можете проверить эту проблему быстро оглавлению все открытые файлы для файла PHP сессии, чтобы увидеть, который HTTPD процесс использует его:
$ sudo lsof | grep sess_it9q6kkvf83gcj72vu05p9fcad7
httpd 31325 apache 74u REG 8,5 410 11634061 /var/lib/php/session/sess_it9q6kkvf83gcj72vu05pfa543
httpd 31632 apache 74uW REG 8,5 410 11634061 /var/lib/php/session/sess_it9q6kkvf83gcj72vu05pfa543
Если два HTTPD процессы имеют доступ к одному файлу сеанса, вероятно, это это ваша проблема. Теперь вы можете проверить, что эти процессы делают трассирование, или в моем случае это было достаточно, чтобы использовать apachectl fullstatus
:
$ sudo apachectl fullstatus | grep 31632
5-7 31632 0/1/1169 _ 0.05 6 30692 0.0 0.02 3.45 111.222.333.444 www.example.com.com /background.php
а) Этот вопрос, вероятно, лучше направлен http://webmasters.stackexchange.com/ б) Кто удалил файл сеанса? Вы или PHP? Как давно он был удален? Вы уверены, что он был удален и не просто заблокирован другим процессом? – DaveRandom
Вы используете управление сеансом php или пользовательский обработчик сеанса? – dqhendricks
Что-нибудь приходит через журнал ошибок, который может связать, почему это происходит? –