- PVSM.RU - https://www.pvsm.ru -

Сессии в PHP — подводный камушек при асинхронных запросах

Небольшая предыстория.

У меня есть хобби-проект трекер.ру
Алгоритм такой: пользователь вводит поисковый запрос, этот запрос «на лету» ищет торренты на сторонних трекерах (рутор, рутрекер, tfile и тд).
Для параллельного поиска идет одновременно несколько аякс запросов, которые должны обработаться асинхронно.
Однако, запросы выполнялись синхронно. Если какой-то трекер долго не отдавал ответ, то остальные запросы подвисали и ждали ответа от подвисшего трекера. Общее время выполнение запросов равнялось сумме всех запросов. Хотя, по моим планам общее время должно было равняться самому долгому запросу.
Долго ломал голову, почему так. Грешил на HTTP pipelining [1]. Но, причина оказалась намного банальней. Все дело в сессиях. Дело в том, что сессии в php консистентны и php не даст обратиться другому процессу к уже занятой сессии.

Потыкать и полюбоваться результатом можно тут [2]. Посмотрите на общее время с сессиями и без.

Чем это плохо:

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

Как лечить?

Изменение хандлеров сессии не поможет.
Как вариант — (об этом уже писали [3]на хабре) в быстром участке кода воспользоваться сессией, а потом выполнить session_write_close();

Автор: Voenniy

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/66798

Ссылки в тексте:

[1] HTTP pipelining: https://en.wikipedia.org/wiki/HTTP_pipelining

[2] можно тут: http://tracker.ru/pip.php

[3] писали : http://habrahabr.ru/post/37206/

[4] Источник: http://habrahabr.ru/post/232305/