PHP-библиотека для взаимодействия с HTTP API Pusher Channels.
Зарегистрируйтесь на https://pusher.com и используйте учетные данные приложения в своем приложении, как показано ниже.
Чтобы сообщить о проблемах, ошибках и запросах функций, пожалуйста, откройте запрос на включение или откройте проблему. Если вы не получили своевременный ответ, посетите наш портал поддержки.
Вы можете получить PHP-библиотеку Pusher Channels через пакет композитора pusher-php-server
. См. https://packagist.org/packages/pusher/pusher-php-server.
$ composer require pusher/pusher-php-server
Или добавьте в composer.json
:
"require" : {
"pusher/pusher-php-server" : " ^7.2 "
}
затем запустите composer update
.
Используйте учетные данные из приложения Pusher Channels, чтобы создать новый экземпляр 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 ]);
Четвертый параметр — это массив $options
. Дополнительные опции:
scheme
- например http или httpshost
— хост, например api.pusherapp.com. Нет конечной косой чертыport
- http-портpath
— префикс для добавления ко всем путям запросов. Это полезно только в том случае, если вы запускаете библиотеку на конечной точке, которой вы управляете самостоятельно (например, прокси-сервер, который маршрутизируется на основе префикса пути).timeout
- тайм-аут HTTPuseTLS
— быстрый вариант использования схемы https и порта 443.cluster
— укажите кластер, из которого запускается приложение.encryption_master_key_base64
— ключ длиной 32 символа. Этот ключ вместе с именем канала используются для получения ключей шифрования для каждого канала. Поканальные ключи используются для шифрования данных о событиях на зашифрованных каналах.Например, по умолчанию вызовы будут осуществляться через HTTPS. Чтобы использовать простой HTTP, вы можете установить для useTLS значение false:
$ options = [
' cluster ' => $ app_cluster ,
' useTLS ' => false
];
$ pusher = new Pusher Pusher ( $ app_key , $ app_secret , $ app_id , $ options );
Рекомендуемый подход к ведению журнала — использовать средство ведения журнала, совместимое с PSR-3, реализующее PsrLogLoggerInterface
. Объект Pusher
реализует PsrLogLoggerAwareInterface
, то есть вы вызываете setLogger(LoggerInterface $logger)
для установки экземпляра журнала.
// where $logger implements `LoggerInterface`
$ pusher -> setLogger ( $ logger );
Эта библиотека использует Guzzle для выполнения HTTP-вызовов. Вы можете передать свой собственный экземпляр Guzzle конструктору Pusher:
$ custom_client = new GuzzleHttp Client ();
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[],
$ custom_client
);
Это позволяет вам передать собственное промежуточное программное обеспечение, пример см. в тестах.
Чтобы вызвать событие на одном или нескольких каналах, используйте функцию trigger
.
$ pusher -> trigger ( ' my-channel ' , ' my_event ' , ' hello world ' );
$ pusher -> trigger ([ ' channel-1 ' , ' channel-2 ' ], ' my_event ' , ' hello world ' );
Также возможно отправлять несколько событий с помощью одного вызова API (максимум 10 событий на вызов в мультитенантных кластерах):
$ batch = [];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' hello ' => ' world ' ]];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' myname ' => ' bob ' ]];
$ pusher -> triggerBatch ( $ batch );
И trigger
, и triggerBatch
имеют асинхронные аналоги в triggerAsync
и triggerBatchAsync
. Эти функции возвращают обещания Guzzle, которые можно объединить с помощью ->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 ();
Массивы автоматически преобразуются в формат JSON:
$ array [ ' name ' ] = ' joe ' ;
$ array [ ' message_count ' ] = 23 ;
$ pusher -> trigger ( ' my_channel ' , ' my_event ' , $ array );
Результатом этого будет:
" {'name': 'joe', 'message_count': 23} "
Чтобы избежать дублирования, вы можете дополнительно указать идентификатор сокета отправителя при запуске события:
$ 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 );
С помощью параметра 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 ;
}
Если ваши данные уже закодированы в формате JSON, вы можете избежать второго этапа кодирования, установив шестой аргумент true, например:
$ pusher -> trigger ( ' my-channel ' , ' event ' , ' data ' , [], true );
Чтобы аутентифицировать пользователей на каналах Pusher в вашем приложении, вы можете использовать authenticateUser
:
$ pusher -> authenticateUser ( ' socket_id ' , ' user-id ' );
Дополнительные сведения см. в разделе аутентификация пользователей.
Чтобы разрешить вашим пользователям доступ к частным каналам на Pusher, вы можете использовать функцию authorizeChannel
:
$ pusher -> authorizeChannel ( ' private-my-channel ' , ' socket_id ' );
Дополнительные сведения см. в разделе авторизация пользователей.
Использование каналов присутствия аналогично частным каналам, но вы можете указать дополнительные данные для идентификации конкретного пользователя:
$ pusher -> authorizePresenceChannel ( ' presence-my-channel ' , ' socket_id ' , ' user_id ' , ' user_info ' );
Дополнительные сведения см. в разделе авторизация пользователей.
Эта библиотека позволяет проверить, что веб-перехватчики, которые вы получаете от Pusher, на самом деле являются подлинными веб-перехватчиками от Pusher. Он также обеспечивает структуру для их хранения. Это позволяет сделать вспомогательный метод webhook
. Передайте заголовки и текст запроса, и он вернет объект Webhook с проверенными вами событиями. Если библиотеке не удалось проверить подпись, вместо этого выдается исключение.
$ webhook = $ pusher -> webhook ( $ request_headers , $ request_body );
$ number_of_events = count ( $ webhook -> get_events ());
$ time_received = $ webhook -> get_time_ms ();
Эта библиотека поддерживает сквозное шифрование ваших частных каналов. Это означает, что только вы и ваши подключенные клиенты смогут читать ваши сообщения. Пушер не может их расшифровать. Вы можете включить эту функцию, выполнив следующие действия:
Сначала вам следует настроить частные каналы. Это предполагает создание конечной точки авторизации на вашем сервере.
Затем сгенерируйте 32-байтовый главный ключ шифрования, закодируйте его в Base64 и надежно сохраните. Это секрет, и вы никогда не должны делиться этим с кем-либо. Даже Пушер.
Чтобы сгенерировать подходящий ключ из хорошего случайного источника, вы можете использовать команду openssl
:
openssl rand -base64 32
Укажите свой главный ключ шифрования при создании клиента Pusher:
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[
' cluster ' => $ app_cluster ,
' encryption_master_key_base64 ' => " <your base64 encoded master key> "
]
);
Каналы, на которых вы хотите использовать сквозное шифрование, должны иметь префикс private-encrypted-
.
Подпишитесь на эти каналы в своем клиенте, и все готово! Вы можете убедиться, что он работает, проверив консоль отладки на https://dashboard.pusher.com/ и увидев зашифрованный зашифрованный текст.
Важное примечание: это не будет шифровать сообщения на каналах, у которых нет префикса private-encrypted-
.
Ограничение : вы не можете инициировать одно событие на смеси незашифрованных и зашифрованных каналов в вызове для trigger
, например
$ data [ ' name ' ] = ' joe ' ;
$ data [ ' message_count ' ] = 23 ;
$ pusher -> trigger ([ ' channel-1 ' , ' private-encrypted-channel-2 ' ], ' test_event ' , $ data );
Обоснование: методы в этой библиотеке напрямую соответствуют запросам HTTP API отдельных каналов. Если бы мы разрешили запуск одного события на нескольких каналах (некоторые зашифрованные, некоторые незашифрованные), то для этого потребовалось бы два запроса API: один, в котором событие зашифровано для зашифрованных каналов, и второй, в котором событие не зашифровано для незашифрованных каналов.
Сначала установите конечную точку авторизации канала в вашем JS-приложении при создании объекта Pusher:
var pusher = new Pusher ( "app_key" ,
// ...
channelAuthorization : {
endpoint : "/presenceAuth.php" ,
} ,
) ;
Затем создайте следующее в 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 );
Примечание. Предполагается, что вы храните своих пользователей в таблице с именем users
и что у этих пользователей есть столбец name
. Также предполагается, что у вас есть механизм входа в систему, который сохраняет user_id
вошедшего в систему пользователя в сеансе.
$ pusher -> getChannelInfo ( $ name );
Также можно получить информацию о канале из HTTP API каналов.
$ info = $ pusher -> getChannelInfo ( ' channel-name ' );
$ channel_occupied = $ info -> occupied ;
Для каналов присутствия вы также можете запросить количество отдельных пользователей, которые в настоящее время подписаны на этот канал (один пользователь может быть подписан много раз, но будет считаться только как один):
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' user_count ' ]);
$ user_count = $ info -> user_count ;
Если вы включили возможность запроса subscription_count
(количество подключений, подписанных в данный момент на этот канал), то вы можете запросить это значение следующим образом:
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' subscription_count ' ]);
$ subscription_count = $ info -> subscription_count ;
$ pusher -> getChannels ();
Также можно получить список каналов для приложения из API каналов HTTP.
$ result = $ pusher -> getChannels ();
$ channel_count = count ( $ result -> channels ); // $channels is an Array
$ pusher -> getChannels ([ ' filter_by_prefix ' => ' some_filter ' ]);
Также можно получить список каналов по префиксу их названий. Для этого вам необходимо передать в вызов параметр $options
. В следующем примере вызов вернет список всех каналов с префиксом presence-
. Это идея для получения списка всех каналов присутствия.
$ results = $ pusher -> getChannels ([ ' filter_by_prefix ' => ' presence- ' ]);
$ channel_count = count ( $ result -> channels ); // $channels is an Array
Этого также можно добиться с помощью общей функции pusher->get
:
$ pusher -> get ( ' /channels ' , [ ' filter_by_prefix ' => ' presence- ' ]);
HTTP API, возвращающий список каналов, не поддерживает возврат количества подписок вместе с каждым каналом. Вместо этого вы можете получить эти данные, перебирая каждый канал и делая еще один запрос. Будьте осторожны: этот подход потребляет (количество каналов + 1) сообщений!
<?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
Этого также можно добиться с помощью общей функции pusher->get
:
$ response = $ pusher -> get ( ' /channels/presence-channel-name/users ' );
$response
имеет формат:
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 );
Используется для выполнения запросов GET
к HTTP API Channels. Осуществляет аутентификацию.
Ответ — ассоциативный массив с индексом result
. Содержимое этого индекса зависит от вызванного метода HTTP. Однако свойство status
, позволяющее использовать код состояния HTTP, всегда присутствует, и свойство result
будет установлено, если код состояния указывает на успешный вызов API.
$ response = $ pusher -> get ( ' /channels ' );
$ http_status_code = $ response [ ' status ' ];
$ result = $ response [ ' result ' ];
Требуется PHPUnit.
composer install
tests
config.example.php
в config.php
и замените значения действительными учетными данными Channels или создайте переменные среды.composer exec phpunit
чтобы запустить все тесты. Авторские права 2014, Пушер. Лицензия MIT: https://www.opensource.org/licenses/mit-license.php.
Авторские права принадлежат Squeeks, 2010 г. Лицензия MIT: https://www.opensource.org/licenses/mit-license.php.