Как сделать длинный опрос ajax с помощью php - mysql

Я сделал php-код, который получает строки из таблицы Asks, которые не читаются:

$sqlanum = "SELECT id FROM asks WHERE answer='' AND profile='1' AND askdate>now()";
$queryanum = mysqli_query($db_conx, $sqlanum);
$rowanum = mysqli_num_rows($queryanum);

Я не знаком с длинным опросом Ajax, я только что прочитал об этом несколько вещей, и после поиска простых примеров длительного опроса Ajax я сделал что-то вроде этого:

$.ajax({
        type: "GET",
        url: "chkasks.php",

        async: true, /* If set to non-async, browser shows page as "Loading.."*/
        cache: false,
        timeout: 50000, /* Timeout in ms */

        success: function(data){ /* called when request completes */
            //addmsg("new", data);
            setTimeout(chkAsks, 1000);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
            setTimeout(chkAsks, 3000);
        }
    });
};

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


person user3380361    schedule 22.03.2014    source источник
comment
Из того, что я пробовал несколько лет назад, у многих популярных веб-серверов были проблемы с этим, наряду с браузерами, поскольку они не сбрасывали данные до определенного предела. Я надеюсь, что кто-то может внести больше понимания, так как я тоже заинтересован. Также я думаю, что то, о чем вы говорите, называется Comet.   -  person David    schedule 22.03.2014
comment
спасибо за ваш ответ .... но я думаю, что Facebook использует длинный опрос   -  person user3380361    schedule 22.03.2014
comment
Если я правильно понимаю, вы хотите каждые X секунд проверять значение $rowanum и изменять поведение вашего клиента в соответствии с его значением?   -  person T. Coeugnet    schedule 22.03.2014
comment
нет, я хочу каждую секунду проверять значение $rowanum, но ничего не возвращать, если для $rowanum нет значения   -  person user3380361    schedule 22.03.2014


Ответы (1)


В вашем PHP вы можете добавить echo $rowanum;, он отправит значение $rowanum в переменную data в вашем JavaScript.

Затем вы можете изменить свой обратный вызов успеха на:

/* .... */
success : function(data) {
    if(data == 0) {
         setTimeout(chkAsks, 1000); //Where chkAsks is the function from which the ajax request is fired
    } else {
          console.log('$rowanum=' + data);
    }
} 
/* .... */

Я не уверен, что это именно то, что вы ищете...

person T. Coeugnet    schedule 22.03.2014
comment
спасибо, но в файле php, что он будет делать, если нет данных, я не хочу, чтобы javascript что-либо делал, если данных нет... - person user3380361; 22.03.2014
comment
Под отсутствием данных вы имеете в виду $rowanum = 0 ? Потому что mysqli_num_rows всегда возвращает значение. Таким образом, вы можете либо сделать в своем PHP-скрипте if ($rowanum != 0) { echo $rowanum; } и проверить, пусты ли данные (if (data == "") { }) в вашем JS, либо всегда выводить значение $rowanum и проверять в своем JS, равно ли оно 0. - person T. Coeugnet; 22.03.2014
comment
если $rowanum = 0 и php продолжает возвращать 0, это означает, что я использую короткий опрос, и это приводит к падению сервера ... и я хочу сделать длинный опрос, чтобы он ничего не возвращал, если $rowanum = 0 и он продолжает зацикливаться... - person user3380361; 22.03.2014
comment
Я думаю, вы должны справиться с этим на стороне сервера. Вы можете зациклить свой SQL-запрос, пока $rowanum != 0, но вам нужно приостанавливать (с помощью sleep()) ваш скрипт между каждым запросом (иначе ваш сервер будет потреблять весь ЦП и делать другие запросы очень медленными). Если $rowanum != 0, вы выходите из цикла и печатаете его значение. Таким образом, ajax будет ждать, пока $rowanum не будет равен != 0. Я никогда этого не делал, но я полагаю, что это работает... - person T. Coeugnet; 22.03.2014