Я впервые пытаюсь использовать длинный опрос, чтобы обновлять список сообщений пользователей в реальном времени, веб-сокеты мне кажутся слишком сложными. Мое приложение пока работает локально.
Вот код PHP, он не полный, я пока просто тестирую:
ini_set('max_execution_time', 0);
ignore_user_abort(false);
$isUptodate = (bool) file_get_contents($this->uptodateFile);
while ($isUptodate === true)
{
sleep(1);
$isUptodate = (bool) file_get_contents($this->uptodateFile);
}
$updateUptodateFile = fopen($this->uptodateFile, 'w');
fwrite($updateUptodateFile, 'true');
$jsonData = json_decode(file_get_contents($this->updateFile), true);
echo json_encode(['updates' => count($jsonData)]);И вот код JS (опять же, это попытки, задержки setTimeout будут изменены позже, когда код будет работать нормально):
checkForUpdates: function ()
{
var that = this;
$.ajax({
url: 'updates.php',
type: 'GET',
dataType: 'json',
timeout: 10000
}).done(function (data)
{
console.info('data received');
if (data.updates)
{
alert('nouveau message');
setTimeout(function () { that.checkForUpdates() }, 5000);
}
}).fail(function (data)
{
console.info(data);
setTimeout(function () { that.checkForUpdates() }, 10000);
});
}Итак, первая странность заключается в том, что если я установлю async: true, cache: false в параметрах ajax, код не сможет правильно загрузить мой файл updates.php.
Вторая странность для меня заключается в том, что если мой цикл выполняется в течение определенного времени, мой сеанс разрушается.
Почему? Насчет длинного опроса, правильно ли я делаю?
@Ezenhis спасибо, это интересно. Хотя кажется, что Edge и IE не поддерживают это, и мне нужно простое кросс-браузерное решение ... Но я буду помнить о событиях на стороне сервера.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В качестве альтернативы длительному опросу (и без использования WebSockets, если они вам не нравятся) вы можете прочитать о событиях на стороне сервера PHP: developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/…