Pusher Channels HTTP API와 상호작용하기 위한 PHP 라이브러리입니다.
https://pusher.com에 등록하고 아래와 같이 앱 내에서 애플리케이션 자격 증명을 사용하세요.
문제, 버그 및 기능 요청을 보고하려면 언제든지 풀 요청을 열거나 문제를 열어주세요. 적시에 응답을 받지 못한 경우 언제든지 지원 포털을 확인하세요.
pusher-php-server
라는 작성기 패키지를 통해 Pusher Channels PHP 라이브러리를 얻을 수 있습니다. 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
실행하십시오.
푸셔 채널 애플리케이션의 자격 증명을 사용하여 새 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
- 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
);
이를 통해 자신만의 미들웨어를 전달할 수 있습니다. 테스트 예를 참조하세요.
하나 이상의 채널에서 이벤트를 트리거하려면 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 형식으로 인코딩된 경우 다음과 같이 여섯 번째 인수를 true로 설정하여 두 번째 인코딩 단계를 피할 수 있습니다.
$ 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로부터 받은 웹후크가 실제로 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 요청이 필요합니다. 하나는 이벤트가 암호화된 채널에 대해 암호화되고 다른 하나는 암호화되지 않은 채널에 대해 이벤트가 암호화되지 않는 것입니다.
Pusher 객체를 생성할 때 먼저 JS 앱에서 채널 인증 엔드포인트를 설정하세요.
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 ();
채널 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 );
채널 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