JQuery AJAX PHP длинный опрос - PullRequest
3 голосов
/ 22 июня 2011

Я пытался заставить этот длинный скрипт опроса работать, но я застреваю.На этот раз у меня проблема с запросом ajax к серверу.Сценарий php, который обслуживает данные (выполнение длинного опроса с использованием цикла и сна), работает отлично, но мой сценарий jQuery - нет.

До сих пор я пытался использовать обычный запрос $.ajax() и$.post() запрос к сценарию, однако, когда я это делаю, весь сценарий останавливается.Ну, на самом деле скрипт загружается так, как и должно быть, но страница показывает, что он продолжает загружаться (с помощью Google Chrome он показывает панель «ожидания» в нижней части экрана).После 60 секундного ожидания в php-скрипте jQuery-скрипт получает «false», потому что данные не найдены.Затем сценарий должен запросить данные agian.

Мой вопрос: как мне избежать, чтобы браузер показывал, что он загружает что-то в фоновом режиме?Мой сервер является общим сервером, поэтому у меня нет доступа к установке чего-либо на самом сервере, поэтому это нужно решить, используя только javascript (jQuery) и php.

EDIT: только что проверил мой скриптв Internet Explorer, и он, похоже, не показывает никаких признаков загрузки скрипта, но это все еще проблема в Google Chrome

РЕДАКТИРОВАТЬ Отправка некоторого кода:

Это мой файл javascript:

if($("#interestboard"))
{
    var lasttime = $("#lasttime").val();
    var pollurl = $("#pollurl").val();
    lpStart();
}
function lpStart()
{
    $.ajax({
        type: "GET",
        url: pollurl+lasttime,
        async: true,
        cache: false,
        success:function(data)
        {
            alert(data);
        },
        error: function()
        {
            alert("Something went wrong");
        }
    });
}

Конечно, это обернуто в $(document).ready()

Мой PHP-скрипт выглядит примерно так:

while(time()-$time<60)
    {
        $this->class = $class["id"];
        $this->orderBy("timestamp");
        $this->_extraConditions = "`timestamp`>'$lastTime' AND ";
        $result = $this->search();
        if($result)
            return $result;
        usleep(250000);
        clearstatcache();
    }

При использовании Firebug (с Google Chrome) это только показывает, что был сделан запрос, но не показывает обычный значок загрузки в конце строки GET в консоли.В Firefox он также просто показывает, что запрос находится в состоянии ожидания (показывает значок загрузки), но по крайней мере браузер не работает так, как загружается страница.

Спасибо ...

1 Ответ

3 голосов
/ 22 июня 2011

Я думаю, что вы должны прочитать верхний комментарий к Chrome AJAX при загрузке страницы приводит к тому, что «занятый курсор» остается - похоже, это специфично для Google Chrome, и вам нужно подождать до ALL содержимое загружается до вызова ajax.

РЕДАКТИРОВАТЬ: просто рекомендация - возможно, я ошибаюсь: вам не следует использовать GET-запросы для выполнения каких-либо значительных / чувствительных операций на вашем сайте, поскольку это может привести к легкой атаке на ваш сайт. Любой, кто владеет / взламывает какой-либо высоконагруженный сайт, может вставить на свою страницу невидимый iframe, чтобы любой пользователь, посещающий эту страницу, мог выполнить этот запрос GET, даже не осознавая этого, - это может привести к сбою / повреждению вашего сервера (поскольку тысячи запросов поступают на ваш сервер). Большинство современных браузеров не допускают межсайтовые POST-запросы, поэтому это должно быть безопасно.

РЕДАКТИРОВАТЬ 2: Ваш сайт недоступен, пока этот скрипт еще работает, даже после того, как вы его прервали: скорее всего, из-за сеансов. Стандартное поведение сеанса позволяет только одному экземпляру php с тем же сеансом работать в тот же момент - все остальные запросы будут ждать до тех пор, пока сеанс не будет закрыт во всех других сценариях. Вам следует закрыть сеанс КАК МОЖНО СКОРЕЕ в сценарии, использовать настраиваемую обработку сеанса, которая разрешит несколько запросов в одном сеансе (скорее всего, это будет очень уродливо) или обнаружить, что пользователь прерывает , чтобы закрыть sript, как только пользователь прервал его в браузере.

...