session_start() и 2+ одновременных запроса к странице

Farsh

~ on ~ high ~ wave ~
session_start() и 2+ одновременных запроса к странице

Добрый день.

[ПРЕДИСТОРИЯ]
Вчера возникла проблема с extjs + symfony . Я не понимал, почему AJAX работает не в 2 асинхронных потока одновременно ( как должно быть в моем текущем браузере ), а в 1. Начал тестировать.
Я создал одиночный тестовый скрипт с контентом "sleep(3)", сделал 2 одновременных запроса - все отлично , время исполнения обоих равно 3 секундам ( а не 6 ). Создал action в symfony с тем же sleep(3), попытался сделать к нему запросы , в итоге время выполнения стало не 3, а 6 секундам. Я в непонятке. Начал дебажить ( logging ). Пришел к выводу , что в symfony есть какой-то баг :). Так как запрос на фронт контроллер приходил в одно и тоже время у обоих запросов, а соответствующий action для второго запроса исполнялся только после исполнения первого . Тут я вообще был в трансе и не мог понять, как "sleep(3)" в одном запросе мог повлиять на совершенно другой запрос .. Методом дальнейшего логгирования я понял, что дело в session_start() ...
[/ПРЕДИСТОРИЯ]

И так, мой вопрос.
Дан .php скрипт:

ini_set('log_errors', 1);
ini_set('error_log', 'error.log');

error_log('start - #'.$_REQUEST['rand']); // rand - это генерируемое число на стороне клиента, чтоб отличить один запрос от другого

session_start();

error_log('after session start - #'.$_REQUEST['rand']);
sleep(3);
error_log('end of script - #'.$_REQUEST['rand']);
Делаю к нему 2 одновременных запроса на AJAX ( код приводить не буду, смысла нет ) .
В итоге в error.log у нас ( под # - номер запроса ):

[17-Dec-2008 19:12:11] start - #1
[17-Dec-2008 19:12:11] after session start - #1
[17-Dec-2008 19:12:11] start - #2
[17-Dec-2008 19:12:14] end of script - #1
[17-Dec-2008 19:12:14] after session start - #2
[17-Dec-2008 19:12:17] end of script - #2
Отсюда мы видим, что session_start() будет выполняться столько времени, пока не исполнится до конца параллельный скрипт от того же клиента.
Так вот прошу мне объяснить, почему такое поведение ? И что нужно сделать, чтоб это предотвратить ? Убрав session_start() - все как нужно .. Как я понимаю, в сессиях при записи в свои файлы происходит аналогия flock() ...

Заранее спасибо.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Файлы сессий лочатся, соответственно пока в одном соединении файл открыт, во втором session_start() ждёт. Решение --- быстренько получать из сессии всё нужное и делать session_write_close().
 
Сверху