Phương thức __construct

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

Tạo một đối tượng kết nối bất đồng bộ.

AsyncTcpConnection cho phép Workerman hoạt động như một khách hàng khởi tạo kết nối bất đồng bộ đến máy chủ từ xa, và gửi/nhận dữ liệu trên kết nối bằng cách sử dụng giao diện send và callback onMessage.

Tham số

Tham số: remote_address

Địa chỉ kết nối, ví dụ
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

Tham số: $context_option

Tham số này yêu cầu (workerman >= 3.3.5)

Dùng để thiết lập ngữ cảnh socket, ví dụ sử dụng bindto để thiết lập địa chỉ IP (giao diện mạng) và cổng nào sẽ được sử dụng để truy cập mạng bên ngoài, thiết lập chứng chỉ ssl, v.v.

Tham khảo stream_context_createTùy chọn ngữ cảnh socketTùy chọn ngữ cảnh SSL

Lưu ý

Hiện tại, các giao thức được AsyncTcpConnection hỗ trợ là tcpsslwsframetext

Cũng hỗ trợ các giao thức tùy chỉnh, xem Cách tùy chỉnh giao thức

Trong số đó, ssl yêu cầu Workerman>=3.3.4 và cài đặt mở rộng openssl

Hiện tại, AsyncTcpConnection không hỗ trợ giao thức http.

Có thể sử dụng new AsyncTcpConnection('ws://...') để khởi tạo kết nối websocket đến máy chủ websocket từ xa trong workerman, xem Ví dụ. Tuy nhiên, không thể khởi tạo kết nối websocket dưới dạng new AsyncTcpConnection('websocket://...') trong workerman.

Ví dụ

Ví dụ 1, Truy cập dịch vụ http bên ngoài một cách bất đồng bộ

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

$task = new Worker();
// Khi quá trình khởi động sẽ bất đồng bộ thiết lập một đối tượng kết nối đến www.baidu.com và gửi nhận dữ liệu
$task->onWorkerStart = function($task)
{
    // Không hỗ trợ chỉ định http một cách trực tiếp, nhưng có thể giả lập giao thức http bằng tcp để gửi dữ liệu
    $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
    // Khi kết nối thành công, gửi dữ liệu yêu cầu http
    $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "kết nối thành công\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 "kết nối đã đóng\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "Mã lỗi:$code msg:$msg\n";
    };
    $connection_to_baidu->connect();
};

// Chạy worker
Worker::runAll();

Ví dụ 2, Truy cập dịch vụ websocket bên ngoài một cách bất đồng bộ, và thiết lập địa chỉ ip cũng như cổng địa phương để truy cập

<?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) {
    // Nếu bạn muốn chỉ khởi tạo kết nối trong một quy trình, bạn có thể kiểm tra $worker->id, ví dụ dưới đây là chỉ khởi tạo kết nối trong quy trình 0
    if ($worker->id != 0) {
        return;
    }
    // Thiết lập địa chỉ ip và cổng của máy địa phương để kết nối đến máy chủ đối phương (mỗi kết nối socket sẽ chiếm một cổng địa phương)
    $context_option = array(
        'socket' => array(
            // ip phải là ip giao diện mạng trên máy của bạn và có thể truy cập được máy chủ đối phương, nếu không sẽ không có hiệu lực
            'bindto' => '114.215.84.87:2333',
        ),
    );

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

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('xin chào');
    };

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

    $con->connect();
};

Worker::runAll();

Ví dụ 3, Truy cập cổng wss bên ngoài một cách bất đồng bộ, và thiết lập chứng chỉ ssl địa phương

<?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){
    // Thiết lập địa chỉ ip và cổng của máy địa phương cũng như chứng chỉ ssl để kết nối đến máy chủ đối phương
    $context_option = array(
        'socket' => array(
            // ip phải là ip giao diện mạng trên máy của bạn và có thể truy cập được máy chủ đối phương, nếu không sẽ không có hiệu lực
            'bindto' => '114.215.84.87:2333',
        ),
        // tùy chọn ssl, tham khảo https://php.net/manual/zh/context.ssl.php
        'ssl' => array(
            // Đường dẫn đến chứng chỉ địa phương. Phải ở định dạng PEM và bao gồm cả chứng chỉ địa phương và khóa riêng.
            'local_cert'        => '/your/path/to/pemfile',
            // Mật khẩu của tệp local_cert.
            'passphrase'        => 'your_pem_passphrase',
            // Có cho phép chứng chỉ tự ký không.
            'allow_self_signed' => true,
            // Có cần xác thực chứng chỉ SSL hay không.
            'verify_peer'       => false
        )
    );

    // Khởi tạo kết nối bất đồng bộ
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // Thiết lập truy cập bằng cách mã hóa ssl
    $con->transport = 'ssl';

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('xin chào');
    };

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

    $con->connect();
};

Worker::runAll();