プッシャー チャネル HTTP API と対話するための PHP ライブラリ。
https://pusher.com に登録し、以下に示すようにアプリ内でアプリケーション資格情報を使用します。
問題、バグ、機能リクエストを報告するには、お気軽にプル リクエストをオープンするか、イシューをオープンしてください。タイムリーに応答が届かない場合は、お気軽にサポート ポータルをご確認ください。
Pusher Channels PHP ライブラリは、 pusher-php-server
という名前の Composer パッケージ経由で入手できます。 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 ]);
4 番目のパラメーターは$options
配列です。追加のオプションは次のとおりです。
scheme
- 例: http または httpshost
- ホスト (api.pusherapp.com など)。末尾のスラッシュなしport
- httpポートpath
- すべてのリクエスト パスに追加するプレフィックス。これは、自分で制御するエンドポイント (パス プレフィックスに基づいてルーティングするプロキシなど) に対してライブラリを実行している場合にのみ役立ちます。timeout
- HTTP タイムアウトuseTLS
- 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 );
推奨されるロギング方法は、 PsrLogLoggerInterface
を実装する PSR-3 準拠のロガーを使用することです。 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
);
これにより、独自のミドルウェアを渡すことができます。例についてはテストを参照してください。
1 つ以上のチャネルでイベントをトリガーするには、 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
にあります。これらの関数は->then
でチェーンできる Guzzle Promise を返します。
$ 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} "
重複を避けるために、イベントをトリガーするときに送信者のソケット ID をオプションで指定できます。
$ 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 形式でエンコードされている場合は、次のように 6 番目の引数を true に設定することで 2 回目のエンコード手順を回避できます。
$ pusher -> trigger ( ' my-channel ' , ' event ' , ' data ' , [], true );
アプリケーションのプッシャー チャネルでユーザーを認証するには、 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 から受信した Webhook が実際に Pusher からの本物の Webhook であることを検証する方法を提供します。また、それらを保管するための構造も提供します。これを可能にするのが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 リクエストに直接マッピングされます。複数のチャネル (暗号化されたものと暗号化されていないもの) で 1 つのイベントをトリガーできるようにした場合、2 つの API リクエストが必要になります。1 つは暗号化されたチャネルに対してイベントが暗号化されるリクエストで、もう 1 つは暗号化されていないチャネルに対してイベントが暗号化されないリクエストです。
Pusher オブジェクトを作成するときに、まず JS アプリでチャネル認証エンドポイントを設定します。
var pusher = new Pusher ( "app_key" ,
// ...
channelAuthorization : {
endpoint : "/presenceAuth.php" ,
} ,
) ;
次に、presentsAuth.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 );
Channels HTTP API からチャネルに関する情報を取得することもできます。
$ info = $ pusher -> getChannelInfo ( ' channel-name ' );
$ channel_occupied = $ info -> occupied ;
プレゼンス チャネルの場合は、現在このチャネルに登録している個別のユーザーの数をクエリすることもできます (1 人のユーザーは何度も登録できますが、1 人としてのみカウントされます)。
$ 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 ();
Channels HTTP API からアプリケーションのチャネルのリストを取得することもできます。
$ 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 );
Channels HTTP API に対してGET
クエリを実行するために使用されます。認証を処理します。
応答はresult
インデックスを含む連想配列です。このインデックスの内容は、呼び出された HTTP メソッドによって異なります。ただし、HTTP ステータス コードを許可するstatus
プロパティは常に存在し、ステータス コードが API への呼び出しの成功を示している場合は、 result
プロパティが設定されます。
$ response = $ pusher -> get ( ' /channels ' );
$ http_status_code = $ response [ ' status ' ];
$ result = $ response [ ' result ' ];
phpunitが必要です。
composer install
を実行するtests
ディレクトリに移動しますconfig.example.php
名前をconfig.php
に変更し、値を有効なチャネル認証情報に置き換えるか、環境変数を作成します。composer exec phpunit
実行してすべてのテストを実行します。 著作権 2014、プッシャー。 MIT ライセンスに基づいてライセンスされています: https://www.opensource.org/licenses/mit-license.php
著作権 2010、Squeeks。 MIT ライセンスに基づいてライセンスされています: https://www.opensource.org/licenses/mit-license.php