Сесії в PHP - підводний камінчик при асинхронних запитах

    
Невелика передісторія.
У мене є хобі-проект трекер.ру
Алгоритм такий: користувач вводить пошуковий запит, цей запит «на льоту» шукає торренти на сторонніх трекерах (рутор, рутрекере, tfile і тд).
Для паралельного пошуку йде одночасно кілька аякс запитів, які повинні оброблений асинхронно.
Однак, запити виконувалися синхронно. Якщо якийсь трекер довго не віддавав відповідь, то інші запити підвисає і чекали відповіді від підвішеному трекера. Загальний час виконання запитів дорівнювало сумі всіх запитів. Хоча, за моїми планами загальний час повинно було дорівнювати найдовшому запитом.
Довго ламав голову, чому так. Грішив на HTTP pipelining . Але, причина виявилася набагато банальніше. Вся справа в сесіях. Справа в тому, що сесії в php Консистентне і php не дасть звернутися іншому процесу до вже зайнятої сесії.
 
Потикати і помилуватися результатом можна тут . Подивіться на загальний час з сесіями і без.
 
 
Чим це погано:
Якщо сайт гальмує, то при відкритті декількох вкладок цього сайту, вкладки будуть завантажуватися по черзі.
Якщо у вас контент подгружается безліччю ajax запитів — то вони виконуватимуться теж по черзі.
 
 
Як лікувати?
Зміна Хандлер сесії не допоможе.
Як варіант — (про це вже писали на Хабре) у швидкому ділянці коду скористатися сесією, а потім виконати session_write_close ();
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.