__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이 지원하는 프로토콜은 tcp, ssl, ws, frame, text입니다.

또한 사용자 정의 프로토콜도 지원하며, 사용자 정의 프로토콜 만드는 방법을 참조하세요.

이 중 ssl은 Workerman>=3.3.4을 요구하며, openssl 확장이 설치되어 있어야 합니다.

현재 AsyncTcpConnection은 http 프로토콜을 지원하지 않습니다.

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 "connect success\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 "connection closed\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "Error code:$code msg:$msg\n";
    };
    $connection_to_baidu->connect();
};

// 워커 실행
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('hello');
    };

    $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',
            // self-signed 인증서를 허용할지 여부.
            '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('hello');
    };

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

    $con->connect();
};

Worker::runAll();