PHP

PHP Polling ChatGPT

Здравствуйте, я задал этот вопрос и раньше в разных форумах но получал один и тот же ответ.

И я недавно задал этот вопрос и на ChatGPT что написал мне это

—————
для передачи на сервер:

Для реализации сервера polling на языке PHP можно использовать следующий код:

index.php

php
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

// подключаем файл с данными
include_once 'data.php';

// запускаем бесконечный цикл
while (true) {
// проверяем наличие новых данных
if(hasNewData()) {
// получаем новые данные
$data = getNewData();
// отправляем данные на клиент
echo "data: " . json_encode($data) . "\n\n";
// принудительно отправляем данные клиенту
ob_flush();
flush();
}
// задержка перед следующей проверкой
sleep(1);
}


data.php

php
<?php
// функция проверки наличия новых данных
function hasNewData() {
// здесь можно описать логику проверки на наличие новых данных
return true;
}

// функция получения новых данных
function getNewData() {
// здесь можно описать логику получения новых данных
return array('foo' => 'bar', 'hello' => 'world');
}


Данный код будет запускать бесконечный цикл, в котором происходит периодическая проверка наличия новых данных. Если новые данные есть, они отправляются на клиент с помощью функции json_encode(). При этом, не забываем делать принудительную отправку данных на клиент с помощью функций ob_flush() и flush().

На фронтенде можно использовать объект EventSource для подключения к серверу polling и получения данных:

javascript
var source = new EventSource('index.php');
source.onmessage = function(event) {
console.log(JSON.parse(event.data));
};


Обращаем внимание, что в объект EventSource передается адрес сервера, где находится скрипт index.php, который в свою очередь реализует сервер polling на языке PHP.
————

Всё бы ничего но я хотел проверить.
Так я создал json файл и внутри
{"num":0}
При каждом цикле я читаю файл
И увеличаю значение num на + 1

И так если заходить через 1 браузер то результат в консоле будет таким
1
2
3
А если заходить через ещё другой браузер то результат
1 браузер - 1
2 браузер - 2
1 браузер - 3
2 браузер - 4
Это означает что каждый раз когда подключаешься запускается новый цикл.
А не один цикл объединяет все запросы.
Тогда бы получалось вот так
1 браузер - 1
2 браузер - 1
1 браузер - 2
2 браузер - 2
Что 2 браузера подключились к одному циклу.
Так вот я всё ещё не понимаю polling ?
Или оно работает так - как я и думаю [пример више]
Если заходить 10 человек то будет 10 циклов а не 1 на всех
Если 10 человек заходят на сайт и используется polling для получения обновлений, каждый клиентский браузер будет инициировать свой собственный цикл запросов-ответов с сервером. Это означает, что на сервере будет выполняться 10 независимых циклов обработки запросов для каждого клиента.

Такой подход может привести к увеличению нагрузки на сервер, особенно если количество клиентов, использующих polling, будет значительным. Каждый запрос требует выделения ресурсов сервера для обработки и ответа на запрос.

Для решения этой проблемы и уменьшения нагрузки на сервер существуют альтернативные подходы, такие как серверные события (Server-Sent Events), веб-сокеты (WebSockets) или использование технологий серверного многопоточного программирования, которые позволяют обрабатывать множество клиентских запросов в одном цикле без блокировки.
Sergey Tsagadaev
Sergey Tsagadaev
57 155
Лучший ответ
Сергей Кузьминых С GPT ом пользуешься ?
Ну общем так.
Я и раньше говорил об этом но мог объяснить спасибо
Изначальная модель клиент-сервер, реализованная в web, предполагала, что инициатором запроса всегда является клиент (браузер), а всё, что может сделать сервер - вернуть ответ на полученный из браузера запрос. По своей инициативе сервер обратиться к браузеру никак не мог.

Но есть задачи, в которых требуется передавать данные не тогда, когда браузер их запросит, а тогда, когда они появились на сервере: например, если реализуется чат в реальном времени. Long Polling (долгие опросы) - придуманный именно для таких задач кривой костыль, позволяющий серверу отправлять данные браузеру в реальном времени через банальный AJAX.

В современном JS есть два встроенных стандартизированных механизма, позволяющих серверу самому инициировать передачу данных: WebSocket и Server Sent Events. Так что смысл использования Long Polling мало отличен от нуля.

Смысл Long Polling в том, что JS-код в браузере отправляет AJAX-запрос на сервер и ждёт...

Если серверному скрипту нечего отдать браузеру (не появилось новых сообщений в чате), то скрипт ничего не передаёт сайту, но и не закрывает соединение. И этот запрос висит, висит, висит, висит... Пока не появятся данные, которые надо отправить или пока сервер не оборвёт соединение по тайм-ауту.

Как только серверный скрипт понимает (не важно, каким образом), что появились данные, которые нужно передать (в чате опубликовано новое сообщение), от тут же отправляет эти данные и закрывает соединение.

Соответственно, на стороне JS-кода может быть два сценария:
Если сервер что-то передал, обрабатываем это что-то, тут же отправляем новый AJAX-запрос на сервер и ждём...
Если сервер вернул ошибку, тут же отправляем новый AJAX-запрос на сервер и ждём...

P.S. Подробно все эти темы есть в учебнике: https://learn.javascript.ru/network
Олег Титов
Олег Титов
65 571
Сергей Кузьминых Да я в курсе и понимаю как это работает. И спасибо кстати за такой ответ что уделяли на это время.
Просто в ChatGPT и в другом месте ответили что
header('Content-Type: text/event-stream');
Типа будет 1 поток работающий скрипт которой объединяет все остальные запросы от front end на один цикл
То есть каждый раз не будет запускаться новый
Я такой о круто
И я думал что может я что то упустил или не понимаю но нет.
Спасибо
Сергей Кузьминых "Однако при использовании polling сервер все равно совершает определенное количество запросов, чтобы обновлять данные. Разница будет заключаться в том, что сервер будет принимать запросы от нескольких клиентов, на которых используется polling, и эти запросы будут «объединены» для выполнения одного обновления данных вместо того, чтобы выполнять множество запросов от каждого клиента."
Сергей Кузьминых Проще пользоваться сокетом