Метод __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 расширение

В настоящее время AsyncTcpConnection не поддерживает протокол http.

Вы можете использовать new AsyncTcpConnection('ws://...') для инициирования websocket-соединения с удаленным websocket-сервером, как это делается в браузере, смотрите Пример. Однако нельзя использовать new AsyncTcpConnection('websocket://...') для инициирования websocket-соединения в workerman.

Примеры

Пример 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
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',
            // Разрешить самоподписанные сертификаты.
            '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();