Metodo __construct

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

Crea un oggetto di connessione asincrona.

AsyncTcpConnection consente a Workerman di fungere da client per avviare una connessione asincrona con un server remoto e inviare e gestire in modo asincrono i dati sulla connessione tramite l'interfaccia di invio e il callback onMessage.

Parametri

Parametro: remote_address

L'indirizzo di connessione, ad esempio

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

Parametro: context_option

Questo parametro richiede (workerman >= 3.3.5)

Utilizzato per impostare il contesto del socket, ad esempio utilizzando bindto per stabilire con quale (scheda di rete) indirizzo IP e porta accedere alla rete esterna, impostando certificati SSL, ecc.

Vedi stream_context_create, Opzioni del contesto del socket, Opzioni del contesto SSL

Nota

Attualmente AsyncTcpConnection supporta i protocolli tcp, ssl, ws, frame, text.

Supporta anche i protocolli personalizzati, consultare Come personalizzare i protocolli

Il protocollo ssl richiede Workerman>=3.3.4 e l'installazione dell'estensione openssl.

Attualmente AsyncTcpConnection non supporta il protocollo http.

È possibile utilizzare new AsyncTcpConnection('ws://...') per avviare una connessione WebSocket remota come un browser in Workerman, vedi Esempio. Ma non è possibile avviare una connessione WebSocket in Workerman utilizzando new AsyncTcpConnection('websocket://...').

Esempi

Esempio 1: Accesso asincrono a un servizio http esterno

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

$task = new Worker();
// Allo start del processo, stabilisce in modo asincrono una connessione a www.baidu.com e invia i dati per ottenere una risposta
$task->onWorkerStart = function($task)
{
    // Non supporta la specifica diretta di http, ma è possibile usare tcp per simulare l'invio del protocollo http
    $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
    // Quando la connessione è stabilita con successo, invia i dati della richiesta http
    $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "Connessione stabilita con successo\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 "Connessione chiusa\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "Codice errore: $code messaggio: $msg\n";
    };
    $connection_to_baidu->connect();
};

// Avvia il worker
Worker::runAll();

Esempio 2: Accesso asincrono a un servizio websocket esterno e impostazione dell'ip e della porta locale di accesso

<?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){
    // Imposta l'ip e la porta locale per accedere all'host remoto (ogni connessione socket occupa una porta locale)
    $context_option = array(
        'socket' => array(
            // L'ip deve essere l'ip della scheda di rete locale e deve essere in grado di accedere all'host remoto, altrimenti sarà invalido
            'bindto' => '114.215.84.87:2333',
        ),
    );

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

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

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

    $con->connect();
};

Worker::runAll();

Esempio 3: Accesso asincrono a una porta wss esterna e configurazione del certificato SSL locale

<?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){
    // Imposta l'ip e la porta locale per accedere all'host remoto, nonché il certificato SSL locale
    $context_option = array(
        'socket' => array(
            // L'ip deve essere l'ip della scheda di rete locale e deve essere in grado di accedere all'host remoto, altrimenti sarà invalido
            'bindto' => '114.215.84.87:2333',
        ),
        // Opzioni SSL, vedere https://php.net/manual/zh/context.ssl.php
        'ssl' => array(
            // Percorso del certificato locale. Deve essere in formato PEM e includere il certificato locale e la chiave privata.
            'local_cert'        => '/percorso/tuo/file.pem',
            // Password del file local_cert.
            'passphrase'        => 'la_tua_passphrase_del_pem',
            // Se consentire certificati auto-firmati.
            'allow_self_signed' => true,
            // Se è necessaria la convalida del certificato SSL.
            'verify_peer'       => false
        )
    );

    // Avvia la connessione asincrona
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // Imposta l'accesso tramite SSL
    $con->transport = 'ssl';

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

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

    $con->connect();
};

Worker::runAll();