__construct メソッド

void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)

非同期接続オブジェクトを作成します。

AsyncTcpConnection は Workerman をクライアントとして使用し、リモートサーバーへの非同期接続を開始し、send インターフェースおよび onMessage コールバックを介して接続上のデータを非同期に送信および処理することを可能にします。

パラメータ

パラメータ:remote_address

接続先のアドレス、例えば
tcp://www.baidu.com:80
ssl://www.baidu.com:443
ws://echo.websocket.org:80
frame://192.168.1.1:8080
text://192.168.1.1:8080

パラメータ:$context_option

このパラメータは(workerman >= 3.3.5)が必要です

ソケットコンテキストを設定するために使用されます。例えば、bindto を使用して、どの (ネットワークインターフェース) IP とポートを使用して外部ネットワークにアクセスするかを設定したり、SSL証明書を設定したりします。

参考 stream_context_createソケットのコンテキストオプションSSL コンテキストオプション

注意

現在、AsyncTcpConnection がサポートするプロトコルは tcpsslwsframetext です。

カスタムプロトコルもサポートされています。詳細は プロトコルのカスタマイズ方法 を参照してください。

その中で、ssl は Workerman >= 3.3.4 が必要で、openssl 拡張 がインストールされている必要があります。

現在、http プロトコルの AsyncTcpConnection はサポートされていません。

new AsyncTcpConnection('ws://...') を使用してブラウザのように Workerman からリモート WebSocket サーバーに WebSocket 接続を開始できます。詳細は を参照してください。ただし、 new AsyncTcpConnection('websocket://...') の形式で Workerman から WebSocket 接続を開始することはできません。

例 1、外部 HTTP サービスに非同期アクセス

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

$task = new Worker();
// プロセス開始時に www.baidu.com への非同期接続オブジェクトを作成し、データを送信して取得します
$task->onWorkerStart = function($task)
{
    // 直接 Http を指定することはできませんが、Tcp を使用して Http プロトコルのデータを模倣して送信できます
    $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
    // 接続が成功したときに HTTP リクエストデータを送信します
    $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "接続成功\n";
        $connection_to_baidu->send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: keep-alive\r\n\r\n");
    };
    $connection_to_baidu->onMessage = function(AsyncTcpConnection $connection_to_baidu, $http_buffer)
    {
        echo $http_buffer;
    };
    $connection_to_baidu->onClose = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "接続終了\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "エラーコード:$code メッセージ:$msg\n";
    };
    $connection_to_baidu->connect();
};

// Worker を実行
Worker::runAll();

例 2、外部 WebSocket サービスに非同期アクセスし、どのローカル IP およびポートでアクセスするかを設定

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

$worker = new Worker();

$worker->onWorkerStart = function($worker) {
    // 接続を一つのプロセス内でのみ発起したい場合、$worker->id を確認して実現できます。例えば以下は 0 番プロセスでのみ接続を発起します
    if ($worker->id != 0) {
        return;
    }
    // 相手ホストへのローカル IP およびポートを設定(各ソケット接続は一つのローカルポートを占有します)
    $context_option = array(
        'socket' => array(
            // IP は必ず自分のネットワークインターフェースの IP であり、相手ホストにアクセスできる必要があります。そうでなければ無効です
            'bindto' => '114.215.84.87:2333',
        ),
    );

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

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('こんにちは');
    };

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

    $con->connect();
};

Worker::runAll();

例 3、外部 WSS ポートに非同期アクセスし、ローカル SSL 証明書を設定

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

$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // 相手ホストへのローカル IP およびポート、および SSL 証明書を設定
    $context_option = array(
        'socket' => array(
            // IP は必ず自分のネットワークインターフェースの IP であり、相手ホストにアクセスできる必要があります。そうでなければ無効です
            'bindto' => '114.215.84.87:2333',
        ),
        // SSL オプション、参照:https://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
        )
    );

    // 非同期接続を発起
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // SSL 暗号化方式でアクセスするための設定
    $con->transport = 'ssl';

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('こんにちは');
    };

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

    $con->connect();
};

Worker::runAll();