Проблема с COMET (Long polling)

Рейтинг: 0Ответов: 2Опубликовано: 18.01.2015

На хостинге есть два файла ajax.php (все запросы) и comet.php (Long polling), примерный код таков:

ajax.php

$answer = array();
if (isset($_POST['action'])) {
    switch ($_POST['action']) {
        case 'test':        
            $answer = array('msg'=>'answer ajax.php');
            break;
        //...
    }
}
header('Content-Type: application/json; charset=utf-8');    
echo json_encode($answer);

comet.php

set_time_limit(0);
$sec = 300;
for ($i = 1; $i <= $sec; $i++) {
    sleep(1);
}
header('Content-Type: application/json; charset=utf-8');    
echo json_encode(array('msg'=>'Прошло '.$sec.' секунд'));

Теперь проблема: делаю ajax запрос к comet.php, следом делаю запрос к ajax.php. ajax.php не обрабатывает запрос (да и сайт перезагрузить не могу), пока не "освободиться" comet.php. В чём может быть проблема?

Ответы

▲ 3Принят

Отвечу сам, может, кто-нибудь столкнётся с подобной проблемой!

Проблема была из-за одновременного доступа к файлам сессии, в начале файла ajax.php и comet.php была строка:

require ('init.php'); // разные настройки, а также запуск сессии(session_start())

Решение - в файле comet.php дописать:

require ('init.php');
//данные сессии сохранить в переменной ... и закрыть сессию
session_write_close();
//после этого уже можно делать зацикливание для Long polling ...

P.S. В самом вопросе я не написал про session_start() - моё упущение, никак не мог подумать, что это может быть причиной...

▲ 2

Не городите костылей с Comet. Существует валидный подход websockets. Проблема актуальна для IE < 10, но можно воспользоваться fallback с flash-ом.

Для бекэнда существует демон Ratchet, построенный поверх ReactPHP. Настраивается быстро - разобрался за вечер. Умеет работать с вышеприведённым fallback-ом.

Или можно поддержать нашу отечественную разработку phpdaemon за авторством Василия Зорина. В своё время настроил с трудом (неактуальная документация) + терялись в неизвестности некоторые запросы.

Если всё же хочется long polling, то посмотрите в сторону dklab_realplexor за авторством Дмитрия Котерова, либо вот ещё один инструмент.

Бонус на посмеяться: Разработка RealTime веб приложений

Мой интерес к реалтайму начался именно с этого видео.