Невозможно реализовать длинный опрос

if(isset($_GET['actionid']) && isset($_GET['profileid']))
{
        $actionid = $_GET['actionid'];
        $profileid = $_GET['profileid'];
        $res = $database->news_poll($profileid,$actionid);
        $k = 0;
        while(!$NROW =$res->fetch_array())
        {
            usleep('50000000');
            $res = $database->news_poll($profileid,$actionid);
        }
        $action = actiontype_encode($NROW,'0',$json,$encode,$database);
        $data['action'] = $action;
        echo json_encode($data);
}

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


person Kunal Singh    schedule 15.03.2012    source источник


Ответы (2)


Если есть какие-то возможности, я рекомендую настроить себя с помощью NodeJS и SocketIO для длительного опроса. Ваш веб-сервер должен поддерживать запрос открытым для каждого подключенного пользователя, и это больше, чем Apache / PHP может обрабатывать очень долго.

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

Недавно я ответил на аналогичный вопрос с дополнительной информацией.

Независимо от языка, я настоятельно не рекомендую писать собственный длинный сервер опроса, если вы не хотите, чтобы это было вашим проектом на пару лет. Я участвовал в проекте, в котором использовался домашний сервер для длинных опросов, написанный на C, а затем переписанный на Java, и это было некрасиво.

person cmc    schedule 15.03.2012
comment
мне нужно реализовать длинный опрос. Это очень важно и действительно необходимо, чтобы исправить это, используя длинный опрос, а не короткий опрос. Пожалуйста, помогите. Укажите актуальную проблему с внедрением. - person Kunal Singh; 15.03.2012

Я понял, что проблема в том, что Apache обслуживает несколько запросов от одного клиента по одному. Поэтому, когда выполняется запрос к сценарию длинного опроса на бэкэнде для получения новых данных, этот запрос зависает от других запросов из того же браузера к тому же серверу.

Чтобы преодолеть этот недостаток, нужно использовать node.js или tornado.

person Kunal Singh    schedule 20.11.2012