PHP-Bibliothek für die Interaktion mit der Pusher Channels HTTP API.
Registrieren Sie sich unter https://pusher.com und verwenden Sie die Anmeldeinformationen für die Anwendung in Ihrer App, wie unten gezeigt.
Wenn Sie Probleme, Fehler oder Funktionsanfragen melden möchten, können Sie jederzeit eine Pull-Anfrage oder ein Problem eröffnen. Sollten Sie keine zeitnahe Antwort erhalten, schauen Sie gerne auf unserem Support-Portal vorbei.
Sie können die Pusher Channels PHP-Bibliothek über ein Composer-Paket namens pusher-php-server
erhalten. Siehe https://packagist.org/packages/pusher/pusher-php-server
$ composer require pusher/pusher-php-server
Oder zu composer.json
hinzufügen:
"require" : {
"pusher/pusher-php-server" : " ^7.2 "
}
Führen Sie dann composer update
aus.
Verwenden Sie die Anmeldeinformationen Ihrer Pusher-Channels-Anwendung, um eine neue PusherPusher
Instanz zu erstellen.
$ app_id = ' YOUR_APP_ID ' ;
$ app_key = ' YOUR_APP_KEY ' ;
$ app_secret = ' YOUR_APP_SECRET ' ;
$ app_cluster = ' YOUR_APP_CLUSTER ' ;
$ pusher = new Pusher Pusher ( $ app_key , $ app_secret , $ app_id , [ ' cluster ' => $ app_cluster ]);
Der vierte Parameter ist ein $options
Array. Die zusätzlichen Optionen sind:
scheme
- zB http oder httpshost
– der Host, z. B. api.pusherapp.com. Kein abschließender Schrägstrichport
– der http-Portpath
– ein Präfix, das an alle Anforderungspfade angehängt wird. Dies ist nur dann sinnvoll, wenn Sie die Bibliothek auf einem Endpunkt ausführen, den Sie selbst steuern (z. B. einen Proxy, der Routen basierend auf dem Pfadpräfix weiterleitet).timeout
– das HTTP-TimeoutuseTLS
– schnelle Option zur Verwendung des Schemas von https und Port 443.cluster
– Geben Sie den Cluster an, von dem aus die Anwendung ausgeführt wird.encryption_master_key_base64
– ein 32 Zeichen langer Schlüssel. Dieser Schlüssel wird zusammen mit dem Kanalnamen verwendet, um Verschlüsselungsschlüssel pro Kanal abzuleiten. Kanalspezifische Schlüssel werden zum Verschlüsseln von Ereignisdaten auf verschlüsselten Kanälen verwendet.Beispielsweise werden Anrufe standardmäßig über HTTPS getätigt. Um einfaches HTTP zu verwenden, können Sie useTLS auf false setzen:
$ options = [
' cluster ' => $ app_cluster ,
' useTLS ' => false
];
$ pusher = new Pusher Pusher ( $ app_key , $ app_secret , $ app_id , $ options );
Der empfohlene Protokollierungsansatz besteht darin, einen PSR-3-kompatiblen Logger zu verwenden, PsrLogLoggerInterface
implementiert. Das Pusher
Objekt implementiert PsrLogLoggerAwareInterface
, was bedeutet, dass Sie setLogger(LoggerInterface $logger)
aufrufen, um die Logger-Instanz festzulegen.
// where $logger implements `LoggerInterface`
$ pusher -> setLogger ( $ logger );
Diese Bibliothek verwendet Guzzle intern, um HTTP-Aufrufe durchzuführen. Sie können Ihre eigene Guzzle-Instanz an den Pusher-Konstruktor übergeben:
$ custom_client = new GuzzleHttp Client ();
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[],
$ custom_client
);
Dadurch können Sie Ihre eigene Middleware einbinden, ein Beispiel finden Sie in den Tests.
Um ein Ereignis auf einem oder mehreren Kanälen auszulösen, verwenden Sie die trigger
.
$ pusher -> trigger ( ' my-channel ' , ' my_event ' , ' hello world ' );
$ pusher -> trigger ([ ' channel-1 ' , ' channel-2 ' ], ' my_event ' , ' hello world ' );
Es ist auch möglich, mehrere Ereignisse mit einem einzigen API-Aufruf zu senden (maximal 10 Ereignisse pro Aufruf auf Multi-Tenant-Clustern):
$ batch = [];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' hello ' => ' world ' ]];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' myname ' => ' bob ' ]];
$ pusher -> triggerBatch ( $ batch );
Sowohl trigger
als auch triggerBatch
haben asynchrone Gegenstücke in triggerAsync
und triggerBatchAsync
. Diese Funktionen geben Guzzle-Versprechen zurück, die mit ->then
verkettet werden können:
$ promise = $ pusher -> triggerAsync ([ ' channel-1 ' , ' channel-2 ' ], ' my_event ' , ' hello world ' );
$ promise -> then ( function ( $ result ) {
// do something with $result
return $ result ;
});
$ final_result = $ promise -> wait ();
Arrays werden automatisch in das JSON-Format konvertiert:
$ array [ ' name ' ] = ' joe ' ;
$ array [ ' message_count ' ] = 23 ;
$ pusher -> trigger ( ' my_channel ' , ' my_event ' , $ array );
Die Ausgabe davon wird sein:
" {'name': 'joe', 'message_count': 23} "
Um Duplikate zu vermeiden, können Sie beim Auslösen eines Ereignisses optional die Socket-ID des Absenders angeben:
$ pusher -> trigger ( ' my-channel ' , ' event ' , ' data ' , [ ' socket_id ' => $ socket_id ]);
$ batch = [];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' hello ' => ' world ' ], [ ' socket_id ' => $ socket_id ]];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' myname ' => ' bob ' ], [ ' socket_id ' => $ socket_id ]];
$ pusher -> triggerBatch ( $ batch );
Mit dem info
Parameter können Attribute zu den Kanälen angefordert werden, auf denen veröffentlicht wurde:
$ result = $ pusher -> trigger ( ' my-channel ' , ' my_event ' , ' hello world ' , [ ' info ' => ' subscription_count ' ]);
$ subscription_count = $ result -> channels [ ' my-channel ' ]-> subscription_count ;
$ batch = [];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' hello ' => ' world ' ], ' info ' => ' subscription_count ' ];
$ batch [] = [ ' channel ' => ' presence-my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' myname ' => ' bob ' ], ' info ' => ' user_count,subscription_count ' ];
$ result = $ pusher -> triggerBatch ( $ batch );
foreach ( $ result -> batch as $ i => $ attributes ) {
echo " channel: { $ batch [ $ i ][ ' channel ' ]} , name: { $ batch [ $ i ][ ' name ' ]}" ;
if ( isset ( $ attributes -> subscription_count )) {
echo " , subscription_count: { $ attributes -> subscription_count }" ;
}
if ( isset ( $ attributes -> user_count )) {
echo " , user_count: { $ attributes -> user_count }" ;
}
echo PHP_EOL ;
}
Wenn Ihre Daten bereits im JSON-Format codiert sind, können Sie einen zweiten Codierungsschritt vermeiden, indem Sie das sechste Argument wie folgt auf „true“ setzen:
$ pusher -> trigger ( ' my-channel ' , ' event ' , ' data ' , [], true );
Um Benutzer auf Pusher-Kanälen in Ihrer Anwendung zu authentifizieren, können Sie die Funktion authenticateUser
verwenden:
$ pusher -> authenticateUser ( ' socket_id ' , ' user-id ' );
Weitere Informationen finden Sie unter Benutzer authentifizieren.
Um Ihren Benutzern den Zugriff auf private Kanäle auf Pusher zu autorisieren, können Sie die Funktion authorizeChannel
verwenden:
$ pusher -> authorizeChannel ( ' private-my-channel ' , ' socket_id ' );
Weitere Informationen finden Sie unter Benutzer autorisieren.
Die Verwendung von Präsenzkanälen ähnelt privaten Kanälen, Sie können jedoch zusätzliche Daten angeben, um diesen bestimmten Benutzer zu identifizieren:
$ pusher -> authorizePresenceChannel ( ' presence-my-channel ' , ' socket_id ' , ' user_id ' , ' user_info ' );
Weitere Informationen finden Sie unter Benutzer autorisieren.
Diese Bibliothek bietet eine Möglichkeit zu überprüfen, ob Webhooks, die Sie von Pusher erhalten, tatsächlich echte Webhooks von Pusher sind. Es bietet auch eine Struktur für deren Speicherung. Eine Hilfsmethode namens webhook
ermöglicht dies. Übergeben Sie die Header und den Text der Anfrage und es wird ein Webhook-Objekt mit Ihren verifizierten Ereignissen zurückgegeben. Wenn die Bibliothek die Signatur nicht validieren konnte, wird stattdessen eine Ausnahme ausgelöst.
$ webhook = $ pusher -> webhook ( $ request_headers , $ request_body );
$ number_of_events = count ( $ webhook -> get_events ());
$ time_received = $ webhook -> get_time_ms ();
Diese Bibliothek unterstützt die End-to-End-Verschlüsselung Ihrer privaten Kanäle. Das bedeutet, dass nur Sie und Ihre verbundenen Kunden Ihre Nachrichten lesen können. Pusher kann sie nicht entschlüsseln. Sie können diese Funktion aktivieren, indem Sie die folgenden Schritte ausführen:
Sie sollten zunächst private Kanäle einrichten. Dazu gehört die Erstellung eines Autorisierungsendpunkts auf Ihrem Server.
Als nächstes generieren Sie Ihren 32-Byte-Hauptverschlüsselungsschlüssel, kodieren ihn mit Base64 und bewahren ihn sicher auf. Dies ist geheim und Sie sollten es niemals an Dritte weitergeben. Nicht einmal Pusher.
Um einen geeigneten Schlüssel aus einer guten Zufallsquelle zu generieren, können Sie den Befehl openssl
verwenden:
openssl rand -base64 32
Geben Sie Ihren Hauptverschlüsselungsschlüssel an, wenn Sie Ihren Pusher-Client erstellen:
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[
' cluster ' => $ app_cluster ,
' encryption_master_key_base64 ' => " <your base64 encoded master key> "
]
);
Kanälen, in denen Sie eine Ende-zu-Ende-Verschlüsselung verwenden möchten, sollte private-encrypted-
vorangestellt werden.
Abonnieren Sie diese Kanäle in Ihrem Client, und schon sind Sie fertig! Sie können überprüfen, ob es funktioniert, indem Sie die Debug-Konsole auf https://dashboard.pusher.com/ überprüfen und den verschlüsselten Chiffretext sehen.
Wichtiger Hinweis: Dadurch werden keine Nachrichten auf Kanälen verschlüsselt, denen nicht private-encrypted-
vorangestellt ist.
Einschränkung : Sie können in einem trigger
kein einzelnes Ereignis auf einer Mischung aus unverschlüsselten und verschlüsselten Kanälen auslösen, z
$ data [ ' name ' ] = ' joe ' ;
$ data [ ' message_count ' ] = 23 ;
$ pusher -> trigger ([ ' channel-1 ' , ' private-encrypted-channel-2 ' ], ' test_event ' , $ data );
Begründung: Die Methoden in dieser Bibliothek werden direkt den HTTP-API-Anfragen einzelner Kanäle zugeordnet. Wenn wir das Auslösen eines einzelnen Ereignisses auf mehreren Kanälen (einige verschlüsselt, andere unverschlüsselt) zulassen würden, wären zwei API-Anfragen erforderlich: eine, bei der das Ereignis für die verschlüsselten Kanäle verschlüsselt wird, und eine, bei der das Ereignis für unverschlüsselte Kanäle unverschlüsselt ist.
Legen Sie beim Erstellen des Pusher-Objekts zunächst den Kanalautorisierungsendpunkt in Ihrer JS-App fest:
var pusher = new Pusher ( "app_key" ,
// ...
channelAuthorization : {
endpoint : "/presenceAuth.php" ,
} ,
) ;
Erstellen Sie als Nächstes Folgendes in PresenceAuth.php:
<?php
header ( ' Content-Type: application/json ' );
if ( isset ( $ _SESSION [ ' user_id ' ])) {
$ stmt = $ pdo -> prepare ( " SELECT * FROM `users` WHERE id = :id " );
$ stmt -> bindValue ( ' :id ' , $ _SESSION [ ' user_id ' ], PDO :: PARAM_INT );
$ stmt -> execute ();
$ user = $ stmt -> fetch ();
} else {
die ( json_encode ( ' no-one is logged in ' ));
}
$ pusher = new Pusher Pusher ( $ key , $ secret , $ app_id );
$ presence_data = [ ' name ' => $ user [ ' name ' ]];
echo $ pusher -> authorizePresenceChannel ( $ _POST [ ' channel_name ' ], $ _POST [ ' socket_id ' ], $ user [ ' id ' ], $ presence_data );
Hinweis: Dies setzt voraus, dass Sie Ihre Benutzer in einer Tabelle namens users
speichern und dass diese Benutzer über eine name
verfügen. Außerdem wird davon ausgegangen, dass Sie über einen Anmeldemechanismus verfügen, der die user_id
des angemeldeten Benutzers in der Sitzung speichert.
$ pusher -> getChannelInfo ( $ name );
Es ist auch möglich, Informationen über einen Kanal über die Channels-HTTP-API abzurufen.
$ info = $ pusher -> getChannelInfo ( ' channel-name ' );
$ channel_occupied = $ info -> occupied ;
Für Präsenzkanäle können Sie auch die Anzahl der einzelnen Benutzer abfragen, die diesen Kanal derzeit abonniert haben (ein einzelner Benutzer kann mehrmals abonniert sein, zählt aber nur als einer):
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' user_count ' ]);
$ user_count = $ info -> user_count ;
Wenn Sie die Möglichkeit aktiviert haben, den subscription_count
(die Anzahl der derzeit für diesen Kanal abonnierten Verbindungen) abzufragen, können Sie diesen Wert wie folgt abfragen:
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' subscription_count ' ]);
$ subscription_count = $ info -> subscription_count ;
$ pusher -> getChannels ();
Es ist auch möglich, eine Liste der Kanäle für eine Anwendung über die Channels-HTTP-API abzurufen.
$ result = $ pusher -> getChannels ();
$ channel_count = count ( $ result -> channels ); // $channels is an Array
$ pusher -> getChannels ([ ' filter_by_prefix ' => ' some_filter ' ]);
Es ist auch möglich, eine Liste der Kanäle basierend auf ihrem Namenspräfix abzurufen. Dazu müssen Sie dem Aufruf einen $options
Parameter übergeben. Im folgenden Beispiel gibt der Anruf eine Liste aller Kanäle mit einem presence-
Präfix zurück. Dies ist eine Idee, um eine Liste aller Präsenzkanäle abzurufen.
$ results = $ pusher -> getChannels ([ ' filter_by_prefix ' => ' presence- ' ]);
$ channel_count = count ( $ result -> channels ); // $channels is an Array
Dies kann auch mit der generischen Funktion pusher->get
erreicht werden:
$ pusher -> get ( ' /channels ' , [ ' filter_by_prefix ' => ' presence- ' ]);
Die HTTP-API, die die Kanalliste zurückgibt, unterstützt nicht die Rückgabe der Abonnementanzahl zusammen mit jedem Kanal. Stattdessen können Sie diese Daten abrufen, indem Sie jeden Kanal durchlaufen und eine weitere Anfrage stellen. Seien Sie gewarnt: Dieser Ansatz verbraucht (Anzahl der Kanäle + 1) Nachrichten!
<?php
$ subscription_counts = [];
foreach ( $ pusher -> getChannels ()-> channels as $ channel => $ v ) {
$ subscription_counts [ $ channel ] =
$ pusher -> getChannelInfo (
$ channel , [ ' info ' => ' subscription_count ' ]
)-> subscription_count ;
}
var_dump ( $ subscription_counts );
$ results = $ pusher -> getPresenceUsers ( ' presence-channel-name ' );
$ users_count = count ( $ results -> users ); // $users is an Array
Dies kann auch mit der generischen Funktion pusher->get
erreicht werden:
$ response = $ pusher -> get ( ' /channels/presence-channel-name/users ' );
Die $response
hat das folgende Format:
Array (
[body] => { " users " :[{ " id " :"a_user_id"}]}
[status] => 200
[result] => Array (
[users] => Array (
[ 0 ] => Array (
[id] => a_user_id
),
/* Additional users */
)
)
)
$ pusher -> get ( $ path , $ params );
Wird verwendet, um GET
Abfragen an die Channels-HTTP-API durchzuführen. Verwaltet die Authentifizierung.
Response ist ein assoziatives Array mit einem result
. Der Inhalt dieses Index hängt von der aufgerufenen HTTP-Methode ab. Es ist jedoch immer eine status
vorhanden, die den HTTP-Statuscode zulässt, und eine result
wird festgelegt, wenn der Statuscode einen erfolgreichen Aufruf der API anzeigt.
$ response = $ pusher -> get ( ' /channels ' );
$ http_status_code = $ response [ ' status ' ];
$ result = $ response [ ' result ' ];
Erfordert PHPUnit.
composer install
tests
config.example.php
in config.php
um und ersetzen Sie die Werte durch gültige Channels-Anmeldeinformationen oder erstellen Sie Umgebungsvariablen.composer exec phpunit
aus, um alle Tests auszuführen. Copyright 2014, Pusher. Lizenziert unter der MIT-Lizenz: https://www.opensource.org/licenses/mit-license.php
Copyright 2010, Squeeks. Lizenziert unter der MIT-Lizenz: https://www.opensource.org/licenses/mit-license.php