@rinaz22

Как сделать long polling на php?

Всем привет! Хочу сделать на сайте появления новых записей с БД без обновления. Написал клиентскую часть, чтобы отправлял длинные ajax запросы не прерывно. С сервером возникли проблемы.
Для сервера написал такой код:
while (true) {
	$query = mysqli_query($db, "SELECT * FROM `table` WHERE `id` = '$_SESSION[id]'");
	if (mysqli_num_rows($query)) { // Если нашли запись
		$row = mysqli_fetch_assoc($query);
		echo "Вывод результатов";
	}
	sleep(2); // Задержка 2 сек.
}

Проблема с обновлением страницы. Когда я хочу обновить страницу, страница не получает ответа от сервера, пока не придет ответ от этого скрипта. В интернете видел только подобные скрипты. Может есть что-то лучше или этот можно как-то улучшить?
С сокетами не знаком и возможности с ним работать тоже нет, т.к. сайт работает на обычном хостинге, который не дает установить сторонние платформы.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
VicTHOR
@VicTHOR
(╮°-°)╮┳━━┳ ( ╯°□°)╯ ┻━━┻
где-то в ядре определяешь текущее количество постов
function getPosts() {
    $query = mysqli_query($db, "SELECT * FROM `table` WHERE `id` = '$_SESSION[id]'");
    $count = mysqli_num_rows($query);
    return [
        'query': $query,
        'count': $count
    ];
}
$posts = getPosts();
$countOfPosts = $posts['count'];

В файле, на который делаешь обращение, сравниваешь текущее количество постов (которое инициализировалось при загрузке страницы) и количество постов на момент обращения
while ($posts['count'] == $countOfPosts) { // условие верно при первом отображении страницы
    $posts = getPosts(); // значение $posts обновляется при первом обращении и каждой итерации цикла
    if ($posts['count'] > $countOfPosts) { // а вот переменная $countOfPosts не обновляется
        $countOfPosts = $posts['count']; // устанавливаем новое значение для нее, если обновились посты
        $row = mysqli_fetch_assoc($posts['query']);
        die "Вывод результатов";
    } // если условие не сработало, пойдет следующая итерация цикла, т.к. $countOfPosts == свежему $posts['count']
    sleep(2); // просто реже делать запросы к базе для уменьшения нагрузки
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
от 130 000 до 180 000 ₽
Сбер Москва
До 240 000 ₽
25 окт. 2020, в 23:21
5000 руб./за проект
25 окт. 2020, в 21:47
1500 руб./за проект
25 окт. 2020, в 19:37
2500 руб./за проект