webman/push
webman/push
est un plugin de serveur de push gratuit, le client fonctionne sur un modèle de souscription, compatible avec pusher, avec de nombreux clients comme JS, Android (java), iOS (swift), iOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS, etc. Le SDK de push pour le backend supporte PHP, Node, Ruby, Asp, Java, Python, Go, Swift, etc. Le client inclut un mécanisme de heartbeat et de reconnexion automatique, ce qui rend son utilisation très simple et stable. Il est adapté pour de nombreux scénarios de messagerie instantanée tels que le push de messages, les discussions, etc.
Le plugin inclut un client web js, push.js, ainsi que un client uniapp, uniapp-push.js
, d'autres clients dans différentes langues peuvent être téléchargés à l'adresse https://pusher.com/docs/channels/channels_libraries/libraries/.
Installation
composer require webman/push
Client (javascript)
Inclure le client javascript
<script src="/plugin/webman/push/push.js"> </script>
Utilisation du client (canal public)
// Établir la connexion
var connection = new Push({
url: 'ws://127.0.0.1:3131', // adresse websocket
app_key: '<app_key, à récupérer dans config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // authentification de souscription (réservée aux canaux privés)
});
// Supposons que l'uid de l'utilisateur est 1
var uid = 1;
// Le navigateur écoute les messages du canal user-1, c'est-à-dire les messages de l'utilisateur ayant l'uid 1
var user_channel = connection.subscribe('user-' + uid);
// Lorsque le canal user-1 reçoit un événement de message
user_channel.on('message', function(data) {
// data contient le contenu du message
console.log(data);
});
// Lorsqu'il y a un événement friendApply sur le canal user-1
user_channel.on('friendApply', function (data) {
// data contient les informations relatives à la demande d'ami
console.log(data);
});
// Supposons que l'id du groupe est 2
var group_id = 2;
// Le navigateur écoute les messages du canal group-2, c'est-à-dire les messages du groupe 2
var group_channel = connection.subscribe('group-' + group_id);
// Lorsque le groupe 2 reçoit un événement de message
group_channel.on('message', function(data) {
// data contient le contenu du message
console.log(data);
});
Conseils
Dans l'exemple ci-dessus, subscribe permet de s'abonner à un canal,message
etfriendApply
sont des événements sur le canal. Les canaux et événements sont des chaînes de caractères arbitraires, il n'est pas nécessaire de les configurer à l'avance sur le serveur.
Push serveur (PHP)
use Webman\Push\Api;
$api = new Api(
// webman peut directement utiliser la configuration via config, un environnement non-webman nécessite d'écrire manuellement la configuration correspondante
'http://127.0.0.1:3232',
config('plugin.webman.push.app.app_key'),
config('plugin.webman.push.app.app_secret')
);
// Push aux tous les clients abonnés au canal user-1 pour l'événement message
$api->trigger('user-1', 'message', [
'from_uid' => 2,
'content' => 'Bonjour, voici le contenu du message'
]);
Canal privé
Dans l'exemple ci-dessus, n'importe quel utilisateur peut s'abonner à des informations via Push.js, ce qui n'est pas sécurisé si les informations sont sensibles.
webman/push
supporte les abonnements de canal privé, les canaux privés commencent par private-
. Par exemple
var connection = new Push({
url: 'ws://127.0.0.1:3131', // adresse websocket
app_key: '<app_key>',
auth: '/plugin/webman/push/auth' // authentification de souscription (réservée aux canaux privés)
});
// Supposons que l'uid de l'utilisateur est 1
var uid = 1;
// Le navigateur écoute les messages du canal privé private-user-1
var user_channel = connection.subscribe('private-user-' + uid);
Lorsque le client s'abonne à un canal privé (un canal commençant par private-
), le navigateur envoie une requête d'authentification ajax (l'url ajax est l'adresse configurée lors de l'initialisation de new Push
avec le paramètre auth), le développeur peut alors vérifier si l'utilisateur a le droit d'écouter ce canal. Cela garantit la sécurité de l'abonnement.
Pour des détails sur l'authentification, voir le code dans
config/plugin/webman/push/route.php
.
Push client
Les exemples ci-dessus montrent uniquement le client qui s'abonne à un canal et le serveur qui appelle l'API pour pousser. webman/push supporte également le push de messages directement depuis le client.
Attention
Le push entre clients ne supporte que les canaux privés (canaux commençant parprivate-
), et le client ne peut déclencher que des événements commençant parclient-
.
Exemple de déclenchement d'événement de push par le 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:"bonjour"});
Attention
Le code ci-dessus envoie des données de l'événementclient-message
à tous les clients abonnés au canalprivate-user-1
(excepté le client qui envoie le push ne recevra pas ses propres données).
Webhooks
Les webhooks sont utilisés pour recevoir certains événements des canaux.
Actuellement, il y a principalement 2 événements :
-
- channel_added
Un événement déclenché lorsque certains clients passent de hors ligne à en ligne pour un canal particulier.
- channel_added
-
- channel_removed
Un événement déclenché lorsque tous les clients d'un canal sont hors ligne.
- channel_removed
Conseils
Ces événements sont très utiles pour maintenir l'état de disponibilité des utilisateurs.Attention
L'url webhook est configurée dansconfig/plugin/webman/push/app.php
.
Le code pour traiter les événements webhook se réfère à la logique dansconfig/plugin/webman/push/route.php
.
Les déconnexions brèves dues au rafraîchissement de la page ne devraient pas être comptées comme hors ligne, webman/push effectue un contrôle de délai, donc les événements en ligne/hors ligne peuvent être retardés de 1 à 3 secondes.
Proxy wss (SSL)
En HTTPS, il n'est pas possible d'utiliser une connexion ws, vous devez utiliser une connexion wss. Dans ce cas, vous pouvez utiliser nginx pour proxy wss avec une configuration ressemblant à ceci :
server {
# .... autres configurations omises ...
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;
}
}
Attention, <app_key>
dans la configuration ci-dessus est récupéré dans config/plugin/webman/push/app.php
.
Après avoir redémarré nginx, il faut utiliser la méthode suivante pour se connecter au serveur
var connection = new Push({
url: 'wss://example.com',
app_key: '<app_key, à récupérer dans config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // authentification de souscription (réservée aux canaux privés)
});
Attention
- L'adresse de la requête doit commencer par wss
- Ne pas spécifier de port
- Il est impératif d'utiliser le nom de domaine correspondant au certificat SSL pour la connexion.
Instructions d'utilisation de push-vue.js
-
Copiez le fichier push-vue.js dans le répertoire de votre projet, par exemple : src/utils/push-vue.js.
-
Incluez-le dans la page vue
## Autres adresses clients
`webman/push` est compatible avec pusher, les adresses de téléchargement pour d'autres langages (Java, Swift, .NET, Objective-C, Unity, Flutter, Android, iOS, AngularJS, etc.) se trouvent à l'adresse :
https://pusher.com/docs/channels/channels_libraries/libraries/