Pustaka PHP untuk berinteraksi dengan API HTTP Saluran Pendorong.
Daftar di https://pusher.com dan gunakan kredensial aplikasi dalam aplikasi Anda seperti yang ditunjukkan di bawah ini.
Untuk melaporkan masalah, bug, dan permintaan fitur, silakan buka pull request atau buka masalah. Jika Anda tidak menerima tanggapan tepat waktu, silakan periksa portal dukungan kami.
Anda bisa mendapatkan perpustakaan Pusher Channels PHP melalui paket komposer bernama pusher-php-server
. Lihat https://packagist.org/packages/pusher/pusher-php-server
$ composer require pusher/pusher-php-server
Atau tambahkan ke composer.json
:
"require" : {
"pusher/pusher-php-server" : " ^7.2 "
}
lalu jalankan composer update
.
Gunakan kredensial dari aplikasi Pusher Channels Anda untuk membuat instance PusherPusher
baru.
$ 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 ]);
Parameter keempat adalah array $options
. Opsi tambahannya adalah:
scheme
- misalnya http atau httpshost
- host misalnya api.pusherapp.com. Tidak ada garis miring ke depanport
- port httppath
- awalan untuk ditambahkan ke semua jalur permintaan. Ini hanya berguna jika Anda menjalankan perpustakaan pada titik akhir yang Anda kendalikan sendiri (misalnya proksi yang merutekan berdasarkan awalan jalur).timeout
- batas waktu HTTPuseTLS
- opsi cepat untuk menggunakan skema https dan port 443.cluster
- tentukan cluster tempat aplikasi dijalankan.encryption_master_key_base64
- kunci sepanjang 32 karakter. Kunci ini, bersama dengan nama saluran, digunakan untuk mendapatkan kunci enkripsi per saluran. Kunci per saluran digunakan untuk mengenkripsi data peristiwa pada saluran terenkripsi.Misalnya, secara default panggilan akan dilakukan melalui HTTPS. Untuk menggunakan HTTP biasa, Anda dapat mengatur useTLS ke false:
$ options = [
' cluster ' => $ app_cluster ,
' useTLS ' => false
];
$ pusher = new Pusher Pusher ( $ app_key , $ app_secret , $ app_id , $ options );
Pendekatan logging yang disarankan adalah dengan menggunakan logger yang sesuai dengan PSR-3 yang menerapkan PsrLogLoggerInterface
. Objek Pusher
mengimplementasikan PsrLogLoggerAwareInterface
, artinya Anda memanggil setLogger(LoggerInterface $logger)
untuk menyetel instance logger.
// where $logger implements `LoggerInterface`
$ pusher -> setLogger ( $ logger );
Perpustakaan ini menggunakan Guzzle secara internal untuk melakukan panggilan HTTP. Anda dapat meneruskan instance Guzzle Anda sendiri ke konstruktor Pusher:
$ custom_client = new GuzzleHttp Client ();
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[],
$ custom_client
);
Ini memungkinkan Anda meneruskan middleware Anda sendiri, lihat tes sebagai contoh.
Untuk memicu suatu peristiwa pada satu atau lebih saluran gunakan fungsi trigger
.
$ pusher -> trigger ( ' my-channel ' , ' my_event ' , ' hello world ' );
$ pusher -> trigger ([ ' channel-1 ' , ' channel-2 ' ], ' my_event ' , ' hello world ' );
Dimungkinkan juga untuk mengirim beberapa peristiwa dengan satu panggilan API (maks 10 peristiwa per panggilan pada klaster multi-penyewa):
$ batch = [];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' hello ' => ' world ' ]];
$ batch [] = [ ' channel ' => ' my-channel ' , ' name ' => ' my_event ' , ' data ' => [ ' myname ' => ' bob ' ]];
$ pusher -> triggerBatch ( $ batch );
Baik trigger
maupun triggerBatch
memiliki rekanan asinkron di triggerAsync
dan triggerBatchAsync
. Fungsi-fungsi ini mengembalikan janji Guzzle yang dapat dirangkai dengan ->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 ();
Array secara otomatis dikonversi ke format JSON:
$ array [ ' name ' ] = ' joe ' ;
$ array [ ' message_count ' ] = 23 ;
$ pusher -> trigger ( ' my_channel ' , ' my_event ' , $ array );
Outputnya adalah:
" {'name': 'joe', 'message_count': 23} "
Untuk menghindari duplikat, Anda dapat menentukan id soket pengirim saat memicu suatu peristiwa:
$ 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 );
Dimungkinkan untuk meminta atribut tentang saluran yang dipublikasikan dengan parameter 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 ;
}
Jika data Anda sudah dikodekan dalam format JSON, Anda dapat menghindari langkah pengkodean kedua dengan menyetel argumen keenam menjadi benar, seperti:
$ pusher -> trigger ( ' my-channel ' , ' event ' , ' data ' , [], true );
Untuk mengautentikasi pengguna di Saluran Pusher pada aplikasi Anda, Anda dapat menggunakan fungsi authenticateUser
:
$ pusher -> authenticateUser ( ' socket_id ' , ' user-id ' );
Untuk informasi lebih lanjut lihat mengautentikasi pengguna.
Untuk memberi otorisasi kepada pengguna Anda untuk mengakses saluran pribadi di Pusher, Anda dapat menggunakan fungsi authorizeChannel
:
$ pusher -> authorizeChannel ( ' private-my-channel ' , ' socket_id ' );
Untuk informasi lebih lanjut lihat memberi otorisasi pada pengguna.
Menggunakan saluran kehadiran mirip dengan saluran pribadi, namun Anda dapat menentukan data tambahan untuk mengidentifikasi pengguna tertentu:
$ pusher -> authorizePresenceChannel ( ' presence-my-channel ' , ' socket_id ' , ' user_id ' , ' user_info ' );
Untuk informasi lebih lanjut lihat memberi otorisasi pada pengguna.
Pustaka ini menyediakan cara untuk memverifikasi bahwa webhook yang Anda terima dari Pusher sebenarnya adalah webhook asli dari Pusher. Ini juga menyediakan struktur untuk menyimpannya. Metode pembantu yang disebut webhook
memungkinkan hal ini. Masukkan header dan isi permintaan, dan itu akan mengembalikan objek Webhook dengan peristiwa terverifikasi Anda. Jika perpustakaan tidak dapat memvalidasi tanda tangan, pengecualian akan diberikan.
$ webhook = $ pusher -> webhook ( $ request_headers , $ request_body );
$ number_of_events = count ( $ webhook -> get_events ());
$ time_received = $ webhook -> get_time_ms ();
Perpustakaan ini mendukung enkripsi ujung ke ujung saluran pribadi Anda. Ini berarti hanya Anda dan klien Anda yang terhubung yang dapat membaca pesan Anda. Pendorong tidak dapat mendekripsinya. Anda dapat mengaktifkan fitur ini dengan mengikuti langkah-langkah berikut:
Anda harus menyiapkan saluran Pribadi terlebih dahulu. Ini melibatkan pembuatan titik akhir otorisasi di server Anda.
Selanjutnya, buat kunci enkripsi master 32 byte Anda, enkode base64, dan simpan dengan aman. Ini rahasia dan Anda tidak boleh membagikannya kepada siapa pun. Bahkan bukan Pendorong.
Untuk menghasilkan kunci yang sesuai dari sumber acak yang baik, Anda dapat menggunakan perintah openssl
:
openssl rand -base64 32
Tentukan kunci enkripsi utama Anda saat membuat klien Pusher Anda:
$ pusher = new Pusher Pusher (
$ app_key ,
$ app_secret ,
$ app_id ,
[
' cluster ' => $ app_cluster ,
' encryption_master_key_base64 ' => " <your base64 encoded master key> "
]
);
Saluran tempat Anda ingin menggunakan enkripsi ujung ke ujung harus diawali dengan private-encrypted-
.
Berlangganan saluran ini di klien Anda, dan selesai! Anda dapat memverifikasi bahwa ini berfungsi dengan memeriksa konsol debug di https://dashboard.pusher.com/ dan melihat teks sandi yang diacak.
Catatan penting: Ini tidak akan mengenkripsi pesan pada saluran yang tidak diawali dengan private-encrypted-
.
Batasan : Anda tidak dapat memicu satu peristiwa pun pada campuran saluran yang tidak terenkripsi dan terenkripsi dalam panggilan untuk trigger
, misalnya
$ data [ ' name ' ] = ' joe ' ;
$ data [ ' message_count ' ] = 23 ;
$ pusher -> trigger ([ ' channel-1 ' , ' private-encrypted-channel-2 ' ], ' test_event ' , $ data );
Dasar Pemikiran: metode di perpustakaan ini dipetakan langsung ke masing-masing permintaan Saluran HTTP API. Jika kami mengizinkan pemicuan satu peristiwa di beberapa saluran (sebagian terenkripsi, sebagian tidak terenkripsi), maka diperlukan dua permintaan API: satu permintaan API yang peristiwanya dienkripsi ke saluran terenkripsi, dan satu permintaan API yang peristiwanya tidak terenkripsi untuk saluran yang tidak terenkripsi.
Pertama-tama atur titik akhir otorisasi saluran di aplikasi JS Anda saat membuat objek Pusher:
var pusher = new Pusher ( "app_key" ,
// ...
channelAuthorization : {
endpoint : "/presenceAuth.php" ,
} ,
) ;
Selanjutnya, buat yang berikut ini di 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 );
Catatan: ini mengasumsikan bahwa Anda menyimpan pengguna Anda dalam tabel bernama users
dan pengguna tersebut memiliki kolom name
. Ini juga mengasumsikan bahwa Anda memiliki mekanisme login yang menyimpan user_id
dari pengguna yang login dalam sesi tersebut.
$ pusher -> getChannelInfo ( $ name );
Dimungkinkan juga untuk mendapatkan informasi tentang saluran dari Channels HTTP API.
$ info = $ pusher -> getChannelInfo ( ' channel-name ' );
$ channel_occupied = $ info -> occupied ;
Untuk saluran kehadiran, Anda juga dapat menanyakan jumlah pengguna berbeda yang saat ini berlangganan saluran ini (satu pengguna mungkin berlangganan berkali-kali, namun hanya akan dihitung sebagai satu):
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' user_count ' ]);
$ user_count = $ info -> user_count ;
Jika Anda telah mengaktifkan kemampuan untuk menanyakan subscription_count
(jumlah koneksi yang saat ini berlangganan saluran ini) maka Anda dapat menanyakan nilai ini sebagai berikut:
$ info = $ pusher -> getChannelInfo ( ' presence-channel-name ' , [ ' info ' => ' subscription_count ' ]);
$ subscription_count = $ info -> subscription_count ;
$ pusher -> getChannels ();
Dimungkinkan juga untuk mendapatkan daftar saluran untuk suatu aplikasi dari Channels HTTP API.
$ result = $ pusher -> getChannels ();
$ channel_count = count ( $ result -> channels ); // $channels is an Array
$ pusher -> getChannels ([ ' filter_by_prefix ' => ' some_filter ' ]);
Dimungkinkan juga untuk mendapatkan daftar saluran berdasarkan awalan namanya. Untuk melakukan ini, Anda perlu menyediakan parameter $options
ke panggilan tersebut. Dalam contoh berikut, panggilan akan mengembalikan daftar semua saluran dengan prefiks presence-
. Ini adalah ide untuk mengambil daftar semua saluran kehadiran.
$ results = $ pusher -> getChannels ([ ' filter_by_prefix ' => ' presence- ' ]);
$ channel_count = count ( $ result -> channels ); // $channels is an Array
Ini juga dapat dicapai dengan menggunakan fungsi pusher->get
generik:
$ pusher -> get ( ' /channels ' , [ ' filter_by_prefix ' => ' presence- ' ]);
API HTTP yang mengembalikan daftar saluran tidak mendukung pengembalian jumlah langganan beserta setiap saluran. Sebagai gantinya, Anda dapat mengambil data ini dengan mengulangi setiap saluran dan membuat permintaan lain. Berhati-hatilah: pendekatan ini menghabiskan (jumlah saluran + 1) pesan!
<?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
Ini juga dapat dicapai dengan menggunakan fungsi pusher->get
generik:
$ response = $ pusher -> get ( ' /channels/presence-channel-name/users ' );
$response
dalam 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 );
Digunakan untuk membuat kueri GET
terhadap Channels HTTP API. Menangani otentikasi.
Respon adalah array asosiatif dengan indeks result
. Isi indeks ini bergantung pada metode HTTP yang dipanggil. Namun, properti status
untuk mengizinkan kode status HTTP selalu ada dan properti result
akan disetel jika kode status menunjukkan panggilan ke API berhasil.
$ response = $ pusher -> get ( ' /channels ' );
$ http_status_code = $ response [ ' status ' ];
$ result = $ response [ ' result ' ];
Membutuhkan phpunit.
composer install
tests
config.example.php
menjadi config.php
dan ganti nilainya dengan kredensial Saluran yang valid atau buat variabel lingkungan.composer exec phpunit
untuk menjalankan semua pengujian. Hak Cipta 2014, Pendorong. Berlisensi di bawah lisensi MIT: https://www.opensource.org/licenses/mit-license.php
Hak Cipta 2010, Squeeks. Berlisensi di bawah lisensi MIT: https://www.opensource.org/licenses/mit-license.php