ws/wss クライアントとしての Workerman

時には、Workerman をクライアントとして ws/wss プロトコルを使用して特定のサーバーに接続し、相互作用する必要があります。以下はその例です。

Workerman を ws クライアントとして使用

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker){

    $con = new AsyncTcpConnection('ws://echo.websocket.org:80');

    // websocket ハンドシェイクが成功した後
    $con->onWebSocketConnect = function(AsyncTcpConnection $con, ) {
        $con->send('hello');
    };

    // メッセージを受信した時
    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

Workerman を wss (ws + ssl) クライアントとして使用

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // ssl は 443 ポートにアクセスする必要があります
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443');

    // ssl 暗号化方式でアクセスするように設定し、wss にします
    $con->transport = 'ssl';

    $con->onWebSocketConnect = function(AsyncTcpConnection $con) {
        $con->send('hello');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

Workerman を wss (ws + ssl) クライアントとして使用 + ローカル ssl 証明書

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // 相手ホストのローカル IP とポート、及び ssl 証明書を設定
    $context_option = array(
        // ssl オプション、参考:http://php.net/manual/zh/context.ssl.php
        'ssl' => array(
            // ローカル証明書のパス。 必ず PEM 形式で、ローカルの証明書と秘密鍵を含む必要があります。
            'local_cert'        => '/your/path/to/pemfile',
            // local_cert ファイルのパスワード。
            'passphrase'        => 'your_pem_passphrase',
            // 自己署名証明書を許可するかどうか。
            'allow_self_signed' => true,
            // SSL 証明書を検証する必要があるかどうか。
            'verify_peer'       => false
        )
    );

    // ssl は 443 ポートにアクセスする必要があります
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // ssl 暗号化方式でアクセスするように設定し、wss にします
    $con->transport = 'ssl';

    $con->onWebSocketConnect = function(AsyncTcpConnection $con) {
        $con->send('hello');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

その他の設定

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Protocols\Ws;
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker();
// プロセス起動時
$worker->onWorkerStart = function()
{
    // websocket プロトコルを使用してリモート websocket サーバーに接続
    $ws_connection = new AsyncTcpConnection("ws://127.0.0.1:1234");
    // 55 秒ごとにオペコードが 0x9 の websocket ハートビートをサーバーに送信
    $ws_connection->websocketPingInterval = 55;
    // カスタム HTTP ヘッダー
    $ws_connection->headers = ['token' => 'value'];
    // データタイプを設定、デフォルトは BINARY_TYPE_BLOB でテキスト
    $ws_connection->websocketType = Ws::BINARY_TYPE_BLOB; // BINARY_TYPE_BLOB はテキスト BINARY_TYPE_ARRAYBUFFER はバイナリ
    // TCP の三者間ハンドシェイクが完了した後
    $ws_connection->onConnect = function($connection){
        echo "tcp connected\n";
    };
    // websocket のハンドシェイクが完了した後
    $ws_connection->onWebSocketConnect = function(AsyncTcpConnection $con, $response) {
        echo $response;
        $con->send('hello');
    };
    // リモート websocket サーバーからメッセージを受信した際
    $ws_connection->onMessage = function($connection, $data){
        echo "recv: $data\n";
    };
    // 接続中にエラーが発生した際、一般的にリモート websocket サーバーへの接続失敗のエラー
    $ws_connection->onError = function($connection, $code, $msg){
        echo "error: $msg\n";
    };
    // リモート websocket サーバーへの接続が切断された際
    $ws_connection->onClose = function($connection){
        echo "connection closed and try to reconnect\n";
        // 接続が切断された場合、1 秒後に再接続
        $connection->reConnect(1);
    };
    // 上記の各種コールバックを設定した後、接続操作を実行
    $ws_connection->connect();
};
Worker::runAll();