webman/push
webman/push
— это бесплатный серверный плагин для отправки уведомлений, клиентская часть основана на модели подписки и совместима с pusher. Имеет множество клиентских библиотек, таких как JS, Android (java), IOS (swift), IOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS и др. Серверный SDK для отправки уведомлений поддерживает PHP, Node, Ruby, Asp, Java, Python, Go, Swift и другие. Клиенты имеют встроенные функции heartbeat и автоматического восстановления соединения, что делает их простыми и стабильными в использовании. Подходит для сценариев мгновенной передачи сообщений, чата и многих других.
Плагин включает в себя веб-клиент push.js и клиент для uniapp uniapp-push.js
. Другие клиентские библиотеки можно скачать по адресу https://pusher.com/docs/channels/channels_libraries/libraries/.
Установка
composer require webman/push
Клиент (javascript)
Подключение javascript клиента
<script src="/plugin/webman/push/push.js"> </script>
Использование клиента (публичный канал)
// Установить соединение
var connection = new Push({
url: 'ws://127.0.0.1:3131', // адрес websocket
app_key: '<app_key, получить в config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // авторизация подписки (только для частных каналов)
});
// Предположим, что uid пользователя 1
var uid = 1;
// Браузер слушает сообщения канала user-1, то есть сообщения пользователя с uid 1
var user_channel = connection.subscribe('user-' + uid);
// Когда в канале user-1 есть событие message
user_channel.on('message', function(data) {
// data содержит текст сообщения
console.log(data);
});
// Когда в канале user-1 есть событие friendApply
user_channel.on('friendApply', function (data) {
// data содержит информацию о заявке в друзья
console.log(data);
});
// Предположим, что id группы 2
var group_id = 2;
// Браузер слушает сообщения канала group-2, то есть слушает сообщения группы 2
var group_channel = connection.subscribe('group-' + group_id);
// Когда в группе 2 есть событие message
group_channel.on('message', function(data) {
// data содержит текст сообщения
console.log(data);
});
Совет
В приведенном выше примере метод subscribe реализует подписку на канал,message
иfriendApply
— это события на канале. Каналы и события могут иметь любые названия, нет необходимости настраивать их заранее на сервере.
Серверная отправка уведомлений (PHP)
use Webman\Push\Api;
$api = new Api(
// В webman можно использовать config для получения настроек, в не-webman окружении необходимо вручную указать соответствующие настройки
'http://127.0.0.1:3232',
config('plugin.webman.push.app.app_key'),
config('plugin.webman.push.app.app_secret')
);
// Отправить сообщение события message всем клиентам, подписанным на user-1
$api->trigger('user-1', 'message', [
'from_uid' => 2,
'content' => 'Привет, это текст сообщения'
]);
Частные каналы
В приведенном выше примере любой пользователь может подписаться на информацию через Push.js, что небезопасно, если информация является конфиденциальной.
webman/push
поддерживает подписку на частные каналы, которые начинаются с private-
. Например
var connection = new Push({
url: 'ws://127.0.0.1:3131', // адрес websocket
app_key: '<app_key>',
auth: '/plugin/webman/push/auth' // авторизация подписки (только для частных каналов)
});
// Предположим, что uid пользователя 1
var uid = 1;
// Браузер слушает сообщения на частном канале private-user-1
var user_channel = connection.subscribe('private-user-' + uid);
Когда клиент подписывается на частный канал (каналл, начинающийся с private-
), браузер отправляет ajax-запрос для авторизации (адрес ajax указывается в параметре auth при создании нового Push). Разработчики могут здесь проверить, имеет ли текущий пользователь право слушать этот канал. Это гарантирует безопасность подписки.
Для информации о авторизации смотрите код в
config/plugin/webman/push/route.php
.
Клиентская отправка уведомлений
В приведенных примерах клиент подписывается на определенный канал, а сервер вызывает API для отправки уведомлений. webman/push также поддерживает прямую отправку сообщений клиентами.
Внимание
Клиентская отправка сообщений поддерживается только для частных каналов (каналы, начинающиеся сprivate-
), и клиенты могут инициировать события, начинающиеся сclient-
.
Пример отправки события клиентом
var user_channel = connection.subscribe('private-user-1');
user_channel.on('client-message', function (data) {
//
});
user_channel.trigger('client-message', {form_uid:2, content:"привет"});
Внимание
В приведенном выше коде отправляются данные событияclient-message
всем клиентам, подписанным наprivate-user-1
, за исключением текущего клиента (отправляющего сообщения).
Webhooks
Webhook используется для получения некоторых событий канала.
На данный момент есть 2 основных события:
-
- channel_added
Событие, которое срабатывает, когда какой-либо канал переходит от отсутствия онлайн-клиентов к наличию онлайн-клиентов, то есть событие «онлайн».
- channel_added
-
- channel_removed
Событие, которое срабатывает, когда все клиенты канала выходят, то есть событие «офлайн».
- channel_removed
Совет
Эти события очень полезны для поддержания статуса онлайн пользователя.Внимание
Адрес webhook настраивается вconfig/plugin/webman/push/app.php
.
Код для обработки событий webhook можно посмотреть в логикеconfig/plugin/webman/push/route.php
.
Обновление страницы, которое временно выводит пользователя из сети, не должно считаться оффлайном, webman/push будет делать задержанные проверки, поэтому события «онлайн» / «офлайн» будут иметь задержку от 1 до 3 секунд.
wss прокси (SSL)
При использовании https невозможно установить ws-соединение, необходимо использовать wss-соединение. В таком случае можно использовать прокси nginx для wss, конфигурация будет выглядеть примерно так:
server {
# .... здесь опущены другие настройки ...
location /app/<app_key>
{
proxy_pass http://127.0.0.1:3131;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
}
Внимание '<app_key>'
в конфигурации берется из config/plugin/webman/push/app.php
.
После перезапуска nginx можно подключиться к серверу следующим образом
var connection = new Push({
url: 'wss://example.com',
app_key: '<app_key, получить в config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // авторизация подписки (только для частных каналов)
});
Внимание
- Адрес запроса должен начинаться с wss
- Не указывайте порт
- Необходимо использовать домен, соответствующий SSL-сертификату для подключения.
Инструкция по использованию push-vue.js
-
Скопируйте файл push-vue.js в директорию проекта, например: src/utils/push-vue.js
-
Импортируйте в vue-странице
## Другие клиентские адреса
`webman/push` совместим с pusher, другие языковые клиентские библиотеки (Java, Swift, .NET, Objective-C, Unity, Flutter, Android, IOS, AngularJS и т.д.) доступны для загрузки по адресу:
https://pusher.com/docs/channels/channels_libraries/libraries/