Biblioteca PHP para interagir com a API HTTP Pusher Channels.
Registre-se em https://pusher.com e use as credenciais do aplicativo conforme mostrado abaixo.
Para relatar problemas, bugs e solicitações de recursos, sinta-se à vontade para abrir uma solicitação pull ou abrir um problema. Se você não receber uma resposta oportuna, sinta-se à vontade para verificar nosso portal de suporte.
Você pode obter a biblioteca PHP Pusher Channels por meio de um pacote compositor chamado pusher-php-server
. Veja https://packagist.org/packages/pusher/pusher-php-server
$ composer require pusher/pusher-php-server
Ou adicione ao composer.json
:
"require" : {
"pusher/pusher-php-server" : " ^7.2 "
}
em seguida, execute composer update
.
Use as credenciais do seu aplicativo Pusher Channels para criar uma nova instância 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 ]);
O quarto parâmetro é um array $options
. As opções adicionais são:
scheme
- por exemplo, http ou httpshost
- o host, por exemplo, api.pusherapp.com. Sem barra finalport
- a porta httppath
- um prefixo a ser anexado a todos os caminhos de solicitação. Isso só é útil se você estiver executando a biblioteca em um endpoint que você mesmo controla (por exemplo, um proxy que roteia com base no prefixo do caminho).timeout
- o tempo limite do HTTPuseTLS
- opção rápida para usar esquema de https e porta 443.cluster
- especifique o cluster de onde o aplicativo está sendo executado.encryption_master_key_base64
- uma chave de 32 caracteres. Essa chave, junto com o nome do canal, é usada para derivar chaves de criptografia por canal. As chaves por canal são usadas para criptografar dados de eventos em canais criptografados.Por exemplo, por padrão, as chamadas serão feitas por HTTPS. Para usar HTTP simples, você pode definir useTLS como falso:
$ options = [
' cluster ' => $ app_cluster ,
' useTLS ' => false
];
$ pusher = new Pusher Pusher ( $ app_key , $ app_secret , $ app_id , $ options );
A abordagem recomendada de registro em log é usar um criador de logs compatível com PSR-3 implementando PsrLogLoggerInterface
. O objeto Pusher
implementa PsrLogLoggerAwareInterface
, o que significa que você chama setLogger(LoggerInterface $logger)
para definir a instância do criador de logs.
// where $logger implements `LoggerInterface`
$ pusher -> setLogger ( $ logger );
Esta biblioteca usa Guzzle internamente para fazer chamadas HTTP. Você pode passar sua própria instância do Guzzle para o construtor Pusher:
$ custom_client = new GuzzleHttp Client ();
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[],
$ custom_client
);
Isso permite que você passe em seu próprio middleware, veja os testes como exemplo.
Para disparar um evento em um ou mais canais, use a função trigger
.
$ pusher -> trigger ( ' my-channel ' , ' my_event ' , ' hello world ' );
$ pusher -> trigger ([ ' channel-1 ' , ' channel-2 ' ], ' my_event ' , ' hello world ' );
Também é possível enviar vários eventos com uma única chamada de API (máximo de 10 eventos por chamada em clusters multilocatários):
$ 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
quanto triggerBatch
têm contrapartes assíncronas em triggerAsync
e triggerBatchAsync
. Essas funções retornam promessas do Guzzle que podem ser encadeadas com ->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 ();
As matrizes são convertidas automaticamente para o formato JSON:
$ array [ ' name ' ] = ' joe ' ;
$ array [ ' message_count ' ] = 23 ;
$ pusher -> trigger ( ' my_channel ' , ' my_event ' , $ array );
A saída disso será:
" {'name': 'joe', 'message_count': 23} "
Para evitar duplicatas, você pode opcionalmente especificar o ID do soquete do remetente ao acionar um 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 );
É possível solicitar atributos sobre os canais que foram publicados com o 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 ;
}
Se seus dados já estiverem codificados no formato JSON, você poderá evitar uma segunda etapa de codificação definindo o sexto argumento como verdadeiro, assim:
$ pusher -> trigger ( ' my-channel ' , ' event ' , ' data ' , [], true );
Para autenticar usuários em Canais Pusher em seu aplicativo, você pode usar a função authenticateUser
:
$ pusher -> authenticateUser ( ' socket_id ' , ' user-id ' );
Para obter mais informações, consulte autenticando usuários.
Para autorizar seus usuários a acessar canais privados no Pusher, você pode usar a função authorizeChannel
:
$ pusher -> authorizeChannel ( ' private-my-channel ' , ' socket_id ' );
Para obter mais informações, consulte autorizando usuários.
O uso de canais de presença é semelhante aos canais privados, mas você pode especificar dados extras para identificar esse usuário específico:
$ pusher -> authorizePresenceChannel ( ' presence-my-channel ' , ' socket_id ' , ' user_id ' , ' user_info ' );
Para obter mais informações, consulte autorizando usuários.
Esta biblioteca fornece uma maneira de verificar se os webhooks que você recebe do Pusher são, na verdade, webhooks genuínos do Pusher. Ele também fornece uma estrutura para armazená-los. Um método auxiliar chamado webhook
permite isso. Passe os cabeçalhos e o corpo da solicitação e ele retornará um objeto Webhook com seus eventos verificados. Se a biblioteca não conseguir validar a assinatura, uma exceção será lançada.
$ webhook = $ pusher -> webhook ( $ request_headers , $ request_body );
$ number_of_events = count ( $ webhook -> get_events ());
$ time_received = $ webhook -> get_time_ms ();
Esta biblioteca oferece suporte à criptografia ponta a ponta de seus canais privados. Isso significa que somente você e seus clientes conectados poderão ler suas mensagens. Pusher não pode descriptografá-los. Você pode ativar esse recurso seguindo estas etapas:
Você deve primeiro configurar canais privados. Isso envolve a criação de um endpoint de autorização em seu servidor.
Em seguida, gere sua chave mestra de criptografia de 32 bytes, codifique-a em base64 e armazene-a com segurança. Isso é segredo e você nunca deve compartilhar isso com ninguém. Nem mesmo Pusher.
Para gerar uma chave apropriada a partir de uma boa fonte aleatória, você pode usar o comando openssl
:
openssl rand -base64 32
Especifique sua chave mestra de criptografia ao criar seu cliente Pusher:
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[
' cluster ' => $ app_cluster ,
' encryption_master_key_base64 ' => " <your base64 encoded master key> "
]
);
Os canais onde você deseja usar criptografia de ponta a ponta devem ser prefixados com private-encrypted-
.
Inscreva-se nesses canais em seu cliente e pronto! Você pode verificar se está funcionando verificando o console de depuração em https://dashboard.pusher.com/ e vendo o texto cifrado embaralhado.
Observação importante: isso não criptografará mensagens em canais que não sejam prefixados por private-encrypted-
.
Limitação : você não pode disparar um único evento em uma mistura de canais não criptografados e criptografados em uma chamada para trigger
, por exemplo
$ data [ ' name ' ] = ' joe ' ;
$ data [ ' message_count ' ] = 23 ;
$ pusher -> trigger ([ ' channel-1 ' , ' private-encrypted-channel-2 ' ], ' test_event ' , $ data );
Justificativa: os métodos nesta biblioteca são mapeados diretamente para solicitações de API HTTP de canais individuais. Se permitíssemos o acionamento de um único evento em vários canais (alguns criptografados, outros não criptografados), seriam necessárias duas solicitações de API: uma em que o evento fosse criptografado para os canais criptografados e outra em que o evento não fosse criptografado para canais não criptografados.
Primeiro defina o endpoint de autorização do canal em seu aplicativo JS ao criar o objeto Pusher:
var pusher = new Pusher ( "app_key" ,
// ...
channelAuthorization : {
endpoint : "/presenceAuth.php" ,
} ,
) ;
Em seguida, crie o seguinte em presençaAuth.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 );
Observação: isso pressupõe que você armazene seus usuários em uma tabela chamada users
e que esses usuários tenham uma coluna name
. Também pressupõe que você tenha um mecanismo de login que armazena o user_id
do usuário conectado na sessão.
$ pusher -> getChannelInfo ( $ name );
Também é possível obter informações sobre um canal na API HTTP de canais.
$ info = $ pusher -> getChannelInfo ( ' channel-name ' );
$ channel_occupied = $ info -> occupied ;
Para canais de presença você também pode consultar o número de usuários distintos atualmente inscritos neste canal (um único usuário pode ser inscrito várias vezes, mas contará apenas como um):
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' user_count ' ]);
$ user_count = $ info -> user_count ;
Se você ativou a capacidade de consultar subscription_count
(o número de conexões atualmente inscritas neste canal), poderá consultar esse valor da seguinte maneira:
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' subscription_count ' ]);
$ subscription_count = $ info -> subscription_count ;
$ pusher -> getChannels ();
Também é possível obter uma lista de canais para um aplicativo na API HTTP de canais.
$ result = $ pusher -> getChannels ();
$ channel_count = count ( $ result -> channels ); // $channels is an Array
$ pusher -> getChannels ([ ' filter_by_prefix ' => ' some_filter ' ]);
Também é possível obter uma lista de canais com base no prefixo do nome. Para fazer isso você precisa fornecer um parâmetro $options
para a chamada. No exemplo a seguir a chamada retornará uma lista de todos os canais com um prefixo presence-
. Esta é uma ideia para obter uma lista de todos os canais de presença.
$ results = $ pusher -> getChannels ([ ' filter_by_prefix ' => ' presence- ' ]);
$ channel_count = count ( $ result -> channels ); // $channels is an Array
Isso também pode ser alcançado usando a função genérica pusher->get
:
$ pusher -> get ( ' /channels ' , [ ' filter_by_prefix ' => ' presence- ' ]);
A API HTTP que retorna a lista de canais não oferece suporte ao retorno da contagem de inscrições junto com cada canal. Em vez disso, você pode buscar esses dados iterando cada canal e fazendo outra solicitação. Esteja avisado: esta abordagem consome (número de canais + 1) mensagens!
<?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
Isso também pode ser alcançado usando a função genérica pusher->get
:
$ response = $ pusher -> get ( ' /channels/presence-channel-name/users ' );
A $response
está no 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 );
Usado para fazer consultas GET
na API HTTP de canais. Lida com autenticação.
Response é uma matriz associativa com um índice result
. O conteúdo deste índice depende do método HTTP que foi chamado. No entanto, uma propriedade status
para permitir o código de status HTTP estará sempre presente e uma propriedade de result
será definida se o código de status indicar uma chamada bem-sucedida para a API.
$ response = $ pusher -> get ( ' /channels ' );
$ http_status_code = $ response [ ' status ' ];
$ result = $ response [ ' result ' ];
Requer phpunit.
composer install
tests
config.example.php
para config.php
e substitua os valores por credenciais de canais válidas ou crie variáveis de ambiente.composer exec phpunit
para executar todos os testes. Direitos autorais 2014, Pusher. Licenciado sob a licença MIT: https://www.opensource.org/licenses/mit-license.php
Direitos autorais 2010, Squeeks. Licenciado sob a licença MIT: https://www.opensource.org/licenses/mit-license.php