#php #facebook #real-time #server-side
#php #Facebook #в режиме реального времени #на стороне сервера
Вопрос:
У меня есть два файла, index.php и callback.php . Index.php используется для отображения данных на веб-сайте. The callback.php это скрипт, который действует как слушатель. The callback.php вызывается сервером и переменной $update в callback.php обновляется сервером в режиме реального времени. Я хочу видеть содержимое переменной $update при каждом ее обновлении.
Callback.php:
if ($method == 'GET' amp;amp; $_GET['hub_mode'] == 'subscribe' amp;amp;
$_GET['hub_verify_token'] == VERIFY_TOKEN) {
echo $_GET['hub_challenge'];
} else if ($method == 'POST') {
$updates = json_decode(file_get_contents("php://input"), true);
//I want to see the content of $updates
// resend the push notification again.
error_log('updates = ' . print_r($updates, true));
}
Как я могу это сделать? Пожалуйста, дайте мне знать. Я был бы признателен, если бы у вас был какой-нибудь пример кода, с которого я мог бы начать.
Ответ №1:
Техника, которую, я полагаю, вы описываете, называется long-polling.
По сути, клиент отправляет ajax-запрос на сервер и сидит там в ожидании ответа. При некотором событии (вот где действительно пригодится SSJS-подобный узел) сервер отправляет клиенту новые данные. После получения данных клиент немедленно отправляет новый запрос и ожидает следующего обновления.
Вот поток:
Страница загружается:
__________ _________
| | | |
| Client A | ---> Request for Data ---> | Server |
|__________| |_________|
Что тогда? Ожидание:
__________ _________
| | | |
| Client A | .......................... | Server |
| waiting | | waiting |
|__________| |_________|
Кто-то другой обновляет содержимое, которое вы хотите видеть в режиме реального времени:
__________
| |
| Client B |
|__________|
|
| Sends update to Server
|___________________.
|
V
__________ _________
| | | |
| client A | ............<------------- | Server |
| waiting | | Reacts |
|__________| |_________|
|
|
V
__________ _________
| | | |
| Client A | ( No open connection) | Server |
| Updates | | Idle... |
|__________| |_________|
|
|
V
___________ _________
| | | |
| Client A | | |
| Reacts to | | Server |
| Update | ---> Request for Data ---> | |
|___________| |_________|
Промыть, повторить
Здесь следует помнить, что HTTP1.1 поддерживает постоянное соединение, что означает, что оно не будет прерываться, если вы этого не захотите. Я бы рекомендовал заглянуть в NodeJS на стороне вашего сервера, чтобы инициировать эти события.
Комментарии:
1. ДА… это, похоже, в какой-то степени то, что я ищу. Мой index.php подписка на некоторые данные в реальном времени на сервер и URL обратного вызова callback.php . сервер отправляет уведомление об изменении на callback.php . Я хочу увидеть уведомление об изменении, которое хранится в $updates.
2. когда вы говорите на стороне сервера, вы имеете в виду сам сервер или callback.php файл? я не контролирую сервер, который отправляет уведомление об изменении на callback.php .
3. У вас должен быть какой-то прослушиватель событий на сервере. PHP, как правило, не лучшее решение для прослушивателей из-за блокирующего ввода-вывода. Например, если вы хотите, чтобы ваш PHP-скрипт каждую секунду проверял базу данных на наличие новых сообщений от других пользователей, вам пришлось бы использовать
sleep(1000)
, который останавливает скрипт и предотвращает запуск других скриптов. Это одно из основных преимуществ NodeJS.