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 скрипт:
В итоге в error.log у нас ( под # - номер запроса ):
Так вот прошу мне объяснить, почему такое поведение ? И что нужно сделать, чтоб это предотвратить ? Убрав session_start() - все как нужно .. Как я понимаю, в сессиях при записи в свои файлы происходит аналогия flock() ...
Заранее спасибо.
Добрый день.
[ПРЕДИСТОРИЯ]
Вчера возникла проблема с extjs + symfony . Я не понимал, почему AJAX работает не в 2 асинхронных потока одновременно ( как должно быть в моем текущем браузере ), а в 1. Начал тестировать.
Я создал одиночный тестовый скрипт с контентом "sleep(3)", сделал 2 одновременных запроса - все отлично , время исполнения обоих равно 3 секундам ( а не 6 ). Создал action в symfony с тем же sleep(3), попытался сделать к нему запросы , в итоге время выполнения стало не 3, а 6 секундам. Я в непонятке. Начал дебажить ( logging ). Пришел к выводу , что в symfony есть какой-то баг
. Так как запрос на фронт контроллер приходил в одно и тоже время у обоих запросов, а соответствующий action для второго запроса исполнялся только после исполнения первого . Тут я вообще был в трансе и не мог понять, как "sleep(3)" в одном запросе мог повлиять на совершенно другой запрос .. Методом дальнейшего логгирования я понял, что дело в session_start() ...[/ПРЕДИСТОРИЯ]
И так, мой вопрос.
Дан .php скрипт:
Делаю к нему 2 одновременных запроса на AJAX ( код приводить не буду, смысла нет ) .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']);
В итоге в error.log у нас ( под # - номер запроса ):
Отсюда мы видим, что session_start() будет выполняться столько времени, пока не исполнится до конца параллельный скрипт от того же клиента.[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() - все как нужно .. Как я понимаю, в сессиях при записи в свои файлы происходит аналогия flock() ...
Заранее спасибо.