Biblioteca PHP para interactuar con la API HTTP de Pusher Channels.
Regístrese en https://pusher.com y use las credenciales de la aplicación dentro de su aplicación como se muestra a continuación.
Para informar problemas, errores y solicitudes de funciones, no dude en abrir una solicitud de extracción o abrir un problema. Si no recibe una respuesta oportuna, no dude en consultar nuestro portal de soporte.
Puede obtener la biblioteca PHP de Pusher Channels a través de un paquete de composición llamado pusher-php-server
. Consulte https://packagist.org/packages/pusher/pusher-php-server
$ composer require pusher/pusher-php-server
O agregar a composer.json
:
"require" : {
"pusher/pusher-php-server" : " ^7.2 "
}
luego ejecute composer update
.
Utilice las credenciales de su aplicación Pusher Channels para crear una nueva instancia PusherPusher
.
$ 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 ]);
El cuarto parámetro es una matriz $options
. Las opciones adicionales son:
scheme
- por ejemplo, http o httpshost
: el host, por ejemplo, api.pusherapp.com. Sin barra diagonalport
- el puerto httppath
: un prefijo que se agregará a todas las rutas de solicitud. Esto sólo es útil si está ejecutando la biblioteca en un punto final que usted mismo controla (por ejemplo, un proxy que enruta según el prefijo de ruta).timeout
: el tiempo de espera de HTTPuseTLS
: opción rápida para utilizar el esquema de https y el puerto 443.cluster
: especifique el cluster desde donde se ejecuta la aplicación.encryption_master_key_base64
: una clave de 32 caracteres de longitud. Esta clave, junto con el nombre del canal, se utilizan para derivar claves de cifrado por canal. Las claves por canal se utilizan para cifrar datos de eventos en canales cifrados.Por ejemplo, de forma predeterminada las llamadas se realizarán a través de HTTPS. Para usar HTTP simple, puedes configurar useTLS en falso:
$ options = [
' cluster ' => $ app_cluster ,
' useTLS ' => false
];
$ pusher = new Pusher Pusher ( $ app_key , $ app_secret , $ app_id , $ options );
El método de registro recomendado es utilizar un registrador compatible con PSR-3 que implemente PsrLogLoggerInterface
. El objeto Pusher
implementa PsrLogLoggerAwareInterface
, lo que significa que llamas setLogger(LoggerInterface $logger)
para configurar la instancia del registrador.
// where $logger implements `LoggerInterface`
$ pusher -> setLogger ( $ logger );
Esta biblioteca utiliza Guzzle internamente para realizar llamadas HTTP. Puedes pasar tu propia instancia de Guzzle al constructor Pusher:
$ custom_client = new GuzzleHttp Client ();
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[],
$ custom_client
);
Esto le permite pasar su propio middleware; consulte las pruebas para ver un ejemplo.
Para activar un evento en uno o más canales utilice la función trigger
.
$ pusher -> trigger ( ' my-channel ' , ' my_event ' , ' hello world ' );
$ pusher -> trigger ([ ' channel-1 ' , ' channel-2 ' ], ' my_event ' , ' hello world ' );
También es posible enviar varios eventos con una única llamada API (máximo 10 eventos por llamada en clústeres multiinquilino):
$ batch = [];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' hello ' => ' world ' ]];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' myname ' => ' bob ' ]];
$ pusher -> triggerBatch ( $ batch );
Tanto trigger
como triggerBatch
tienen contrapartes asincrónicas en triggerAsync
y triggerBatchAsync
. Estas funciones devuelven promesas de Guzzle que se pueden encadenar con ->then
:
$ 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 ();
Las matrices se convierten automáticamente al formato JSON:
$ array [ ' name ' ] = ' joe ' ;
$ array [ ' message_count ' ] = 23 ;
$ pusher -> trigger ( ' my_channel ' , ' my_event ' , $ array );
El resultado de esto será:
" {'name': 'joe', 'message_count': 23} "
Para evitar duplicados, opcionalmente puede especificar la identificación del socket del remitente al activar un evento:
$ 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 );
Es posible solicitar atributos sobre los canales en los que se publicaron con el parámetro info
:
$ 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 ;
}
Si sus datos ya están codificados en formato JSON, puede evitar un segundo paso de codificación estableciendo el sexto argumento como verdadero, así:
$ pusher -> trigger ( ' my-channel ' , ' event ' , ' data ' , [], true );
Para autenticar usuarios en Pusher Channels en su aplicación, puede usar la función authenticateUser
:
$ pusher -> authenticateUser ( ' socket_id ' , ' user-id ' );
Para obtener más información, consulte autenticación de usuarios.
Para autorizar a sus usuarios a acceder a canales privados en Pusher, puede utilizar la función authorizeChannel
:
$ pusher -> authorizeChannel ( ' private-my-channel ' , ' socket_id ' );
Para obtener más información, consulte autorización de usuarios.
El uso de canales de presencia es similar a los canales privados, pero puedes especificar datos adicionales para identificar a ese usuario en particular:
$ pusher -> authorizePresenceChannel ( ' presence-my-channel ' , ' socket_id ' , ' user_id ' , ' user_info ' );
Para obtener más información, consulte autorización de usuarios.
Esta biblioteca proporciona una forma de verificar que los webhooks que recibe de Pusher son en realidad webhooks genuinos de Pusher. También proporciona una estructura para almacenarlos. Un método auxiliar llamado webhook
lo permite. Pase los encabezados y el cuerpo de la solicitud y devolverá un objeto Webhook con sus eventos verificados. Si la biblioteca no pudo validar la firma, se lanza una excepción.
$ webhook = $ pusher -> webhook ( $ request_headers , $ request_body );
$ number_of_events = count ( $ webhook -> get_events ());
$ time_received = $ webhook -> get_time_ms ();
Esta biblioteca admite el cifrado de extremo a extremo de sus canales privados. Esto significa que sólo usted y sus clientes conectados podrán leer sus mensajes. Pusher no puede descifrarlos. Puede habilitar esta función siguiendo estos pasos:
Primero debes configurar canales privados. Esto implica crear un punto final de autorización en su servidor.
A continuación, genere su clave de cifrado maestra de 32 bytes, codifíquela en base64 y guárdela de forma segura. Esto es secreto y nunca debes compartirlo con nadie. Ni siquiera Pusher.
Para generar una clave adecuada a partir de una buena fuente aleatoria, puede utilizar el comando openssl
:
openssl rand -base64 32
Especifique su clave de cifrado maestra al crear su cliente Pusher:
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[
' cluster ' => $ app_cluster ,
' encryption_master_key_base64 ' => " <your base64 encoded master key> "
]
);
Los canales en los que desee utilizar cifrado de extremo a extremo deben tener el prefijo private-encrypted-
.
Suscríbete a estos canales en tu cliente y ¡listo! Puede verificar que está funcionando consultando la consola de depuración en https://dashboard.pusher.com/ y viendo el texto cifrado codificado.
Nota importante: esto no cifrará mensajes en canales que no tengan el prefijo private-encrypted-
.
Limitación : no puede activar un solo evento en una combinación de canales cifrados y no cifrados en una llamada para trigger
, por ejemplo
$ data [ ' name ' ] = ' joe ' ;
$ data [ ' message_count ' ] = 23 ;
$ pusher -> trigger ([ ' channel-1 ' , ' private-encrypted-channel-2 ' ], ' test_event ' , $ data );
Justificación: los métodos de esta biblioteca se asignan directamente a solicitudes de API HTTP de canales individuales. Si permitiéramos activar un único evento en varios canales (algunos cifrados, otros no cifrados), entonces se necesitarían dos solicitudes de API: una en la que el evento esté cifrado para los canales cifrados y otra en la que el evento no esté cifrado para los canales no cifrados.
Primero configure el punto final de autorización del canal en su aplicación JS al crear el objeto Pusher:
var pusher = new Pusher ( "app_key" ,
// ...
channelAuthorization : {
endpoint : "/presenceAuth.php" ,
} ,
) ;
A continuación, cree lo siguiente en presenciaAuth.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 );
Nota: esto supone que almacena a sus usuarios en una tabla llamada users
y que esos usuarios tienen una columna name
. También se supone que tiene un mecanismo de inicio de sesión que almacena el user_id
del usuario que inició sesión en la sesión.
$ pusher -> getChannelInfo ( $ name );
También es posible obtener información sobre un canal desde la API HTTP de canales.
$ info = $ pusher -> getChannelInfo ( ' channel-name ' );
$ channel_occupied = $ info -> occupied ;
Para canales de presencia, también puede consultar la cantidad de usuarios distintos actualmente suscritos a este canal (un solo usuario puede estar suscrito muchas veces, pero solo contará como uno):
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' user_count ' ]);
$ user_count = $ info -> user_count ;
Si ha habilitado la capacidad de consultar el subscription_count
(el número de conexiones actualmente suscritas a este canal), puede consultar este valor de la siguiente manera:
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' subscription_count ' ]);
$ subscription_count = $ info -> subscription_count ;
$ pusher -> getChannels ();
También es posible obtener una lista de canales para una aplicación desde la API HTTP de canales.
$ result = $ pusher -> getChannels ();
$ channel_count = count ( $ result -> channels ); // $channels is an Array
$ pusher -> getChannels ([ ' filter_by_prefix ' => ' some_filter ' ]);
También es posible obtener una lista de canales según el prefijo de su nombre. Para hacer esto, debe proporcionar un parámetro $options
a la llamada. En el siguiente ejemplo, la llamada devolverá una lista de todos los canales con un prefijo presence-
. Esta es una idea para obtener una lista de todos los canales de presencia.
$ results = $ pusher -> getChannels ([ ' filter_by_prefix ' => ' presence- ' ]);
$ channel_count = count ( $ result -> channels ); // $channels is an Array
Esto también se puede lograr usando la función genérica pusher->get
:
$ pusher -> get ( ' /channels ' , [ ' filter_by_prefix ' => ' presence- ' ]);
La API HTTP que devuelve la lista de canales no admite la devolución del recuento de suscripciones junto con cada canal. En su lugar, puede obtener estos datos iterando sobre cada canal y realizando otra solicitud. Tenga cuidado: ¡este enfoque consume (número de canales + 1) mensajes!
<?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
Esto también se puede lograr usando la función genérica pusher->get
:
$ response = $ pusher -> get ( ' /channels/presence-channel-name/users ' );
La $response
tiene el formato:
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 );
Se utiliza para realizar consultas GET
en la API HTTP de canales. Maneja la autenticación.
La respuesta es una matriz asociativa con un índice result
. El contenido de este índice depende del método HTTP que se llamó. Sin embargo, siempre está presente una propiedad status
para permitir el código de estado HTTP y se establecerá una propiedad de result
si el código de estado indica una llamada exitosa a la API.
$ response = $ pusher -> get ( ' /channels ' );
$ http_status_code = $ response [ ' status ' ];
$ result = $ response [ ' result ' ];
Requiere phpunit.
composer install
tests
config.example.php
a config.php
y reemplace los valores con credenciales de Canales válidas o cree variables de entorno.composer exec phpunit
para ejecutar todas las pruebas. Copyright 2014, empujador. Licenciado bajo la licencia MIT: https://www.opensource.org/licenses/mit-license.php
Copyright 2010, Squeeks. Licenciado bajo la licencia MIT: https://www.opensource.org/licenses/mit-license.php