Невозможно реализовать длинный опрос - PullRequest
1 голос
/ 15 марта 2012
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);
}

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

Ответы [ 2 ]

1 голос
/ 15 марта 2012

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

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

Я недавно ответил на похожий вопрос: подробнее .

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

0 голосов
/ 20 ноября 2012

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

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

...