Método __construct

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

Cria um objeto de conexão assíncrona.

AsyncTcpConnection permite que o Workerman inicie uma conexão assíncrona como cliente para um servidor remoto e envie e processe dados na conexão de forma assíncrona através da interface send e do callback onMessage.

Parâmetros

Parâmetro: remote_address

O endereço da conexão, por exemplo:
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

Parâmetro: $context_option

Este parâmetro requer (workerman >= 3.3.5)

Usado para configurar o contexto do socket, por exemplo, usando bindto para definir qual IP (interface de rede) e porta usar para acessar a rede externa, configurar certificados ssl, etc.

Consulte stream_context_create, Opções do contexto do socket, Opções do contexto SSL

Atenção

Atualmente, os protocolos suportados pelo AsyncTcpConnection incluem tcp, ssl, ws, frame, text.

Também suporta protocolos personalizados, consulte Como personalizar protocolos

O ssl exige Workerman>=3.3.4 e a instalação da extensão openssl.

Atualmente, o AsyncTcpConnection não suporta o protocolo http.

Você pode usar new AsyncTcpConnection('ws://...') para iniciar uma conexão websocket com um servidor websocket remoto, semelhante ao que um navegador faz, consulte Exemplo. No entanto, não é possível iniciar uma conexão websocket com new AsyncTcpConnection('websocket://...').

Exemplos

Exemplo 1: Acesso assíncrono a um serviço http externo

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

$task = new Worker();
// Ao iniciar o processo, crie assíncronamente um objeto de conexão com www.baidu.com e envie dados para receber dados
$task->onWorkerStart = function($task)
{
    // Não suporta especificar http diretamente, mas pode simular o protocolo http usando tcp para enviar dados
    $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
    // Quando a conexão for estabelecida com sucesso, envie os dados da requisição http
    $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "conexão bem-sucedida\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 "conexão fechada\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "Código de erro:$code msg:$msg\n";
    };
    $connection_to_baidu->connect();
};

// Executa o worker
Worker::runAll();

Exemplo 2: Acesso assíncrono a um serviço websocket externo, configurando o IP e a porta locais

<?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) {
    // Se você deseja iniciar a conexão apenas em um processo, pode fazer isso verificando $worker->id, por exemplo, abaixo é só no processo 0 que iniciará a conexão
    if ($worker->id != 0) {
        return;
    }
    // Configurar o IP e a porta locais para acessar o host remoto (cada conexão de socket usará uma porta local)
    $context_option = array(
        'socket' => array(
            // O IP deve ser o IP da interface de rede local e deve ter acesso ao host remoto, caso contrário, será inválido
            '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();

Exemplo 3: Acesso assíncrono à porta wss externa, configurando o certificado ssl local

<?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){
    // Configurar o IP e a porta locais para acessar o host remoto e o certificado ssl
    $context_option = array(
        'socket' => array(
            // O IP deve ser o IP da interface de rede local e deve ter acesso ao host remoto, caso contrário, será inválido
            'bindto' => '114.215.84.87:2333',
        ),
        // Opções ssl, consulte https://php.net/manual/zh/context.ssl.php
        'ssl' => array(
            // Caminho do certificado local. Deve estar em formato PEM e incluir o certificado e a chave privada.
            'local_cert'        => '/your/path/to/pemfile',
            // Senha do arquivo local_cert.
            'passphrase'        => 'your_pem_passphrase',
            // Permitir certificados autoassinados.
            'allow_self_signed' => true,
            // Se é necessário verificar o certificado SSL.
            'verify_peer'       => false
        )
    );

    // Iniciar conexão assíncrona
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // Configurar para acessar de forma criptografada com ssl
    $con->transport = 'ssl';

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

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

    $con->connect();
};

Worker::runAll();