Почему я вижу таймауты выполнения при установке значений $ _SESSION? - PullRequest
5 голосов
/ 08 июня 2010

Я вижу следующие ошибки в моих журналах ошибок PHP:

PHP Fatal error: Maximum execution time of 60 seconds exceeded in D:\sites\s105504\www\index.php on line 3
PHP Fatal error: Maximum execution time of 60 seconds exceeded in D:\sites\s105504\www\search.php on line 4

Рассматриваемые строки:

index.php:

01 <?php
02 session_start();
03 ob_start();
04 error_reporting(E_All);
05 $_SESSION['nav'] = "range";  // <-- Error generated here

search.php

01 <?php
02 
03 session_start();
04 $_SESSION['nav'] = "range";
05 $_SESSION['navselected'] = 21; // <-- Error generated here

Неужели потребуется более 60 секунд, чтобы присвоить значение $_SESSION[]?

Платформа:

  • Windows 2003 SP2 + IIS6
  • FastCGI для Windows 2003 (оригинальная сборка RTM)
  • PHP 5.2.6 Сборка без потоков

Нет проблем с очисткой файлов данных сеанса на сервере по истечении срока сеанса. Самому старому файлу sess_XXXXXXXXXXXXXX, который я вижу, около 2 часов.

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

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

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

1 Ответ

9 голосов
/ 08 июня 2010

Сессии блокируются.session_start() будет блокировать выполнение до тех пор, пока не получит эксклюзивную блокировку для файла этого конкретного сеанса.Это необходимо для предотвращения возникновения проблем параллелизма.Вы можете решить эту проблему, выдав session_write_close(), когда закончите сеанс в каждом скрипте.Причина, по которой вы видите это на следующей строке, состоит в том, что session_start() блоков больше, чем максимальное время выполнения.Поэтому, когда он возвращается, следующая строка выполняется после ограничения по времени, вот где возникает ошибка.

См .: session_write_close () для получения дополнительной информации

Ohи на основе опубликованных ошибок ошибка генерируется в строках ob_start(); и $_SESSION['nav'] = "range"; соответственно, а не в строке 5, указанной вами в разделе кода ...

...