Méthode __construct

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

Créer un objet de connexion asynchrone.

AsyncTcpConnection permet à Workerman de se connecter de manière asynchrone à des serveurs distants en tant que client et d'envoyer et traiter des données via l'interface send et le rappel onMessage.

Paramètres

Paramètre : remote_address

L'adresse de connexion, par exemple
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

Paramètre : $context_option

Ce paramètre nécessite (workerman >= 3.3.5)

Utilisé pour définir le contexte du socket, par exemple en utilisant bindto pour indiquer avec quelle adresse IP (carte réseau) et quel port accéder à Internet, configurer les certificats SSL, etc.

Voir stream_context_create, Options de contexte de socket, Options de contexte SSL

Attention

Actuellement, les protocoles pris en charge par AsyncTcpConnection sont tcp, ssl, ws, frame, text.

Il prend également en charge les protocoles personnalisés, voir Comment personnaliser le protocole

Le protocole ssl nécessite Workerman>=3.3.4, et l'installation de l'extension openssl.

Le protocole http n'est actuellement pas pris en charge par AsyncTcpConnection.

Vous pouvez initier une connexion websocket à un serveur websocket distant dans Workerman en utilisant new AsyncTcpConnection('ws://...'), voir Exemple. Cependant, il n'est pas possible de lancer une connexion websocket avec la forme new AsyncTcpConnection('websocket://...') dans Workerman.

Exemples

Exemple 1, accès asynchrone à un service http externe

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

$task = new Worker();
// Lors du démarrage du processus, un objet de connexion asynchrone à www.baidu.com est créé et des données sont envoyées pour obtenir des données
$task->onWorkerStart = function($task)
{
    // HTTP n'est pas supporté directement, mais on peut simuler le protocole HTTP avec TCP pour envoyer des données
    $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
    // Lors de l'établissement de la connexion avec succès, envoyer des données de requête HTTP
    $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "connexion réussie\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 "connexion fermée\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "Code erreur:$code msg:$msg\n";
    };
    $connection_to_baidu->connect();
};

// Lancer le worker
Worker::runAll();

Exemple 2, accès asynchrone à un service websocket externe, en spécifiant quelle adresse IP locale et quel port utiliser

<?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) {
    // Si vous souhaitez initier la connexion seulement dans un processus, vous pouvez le faire en vérifiant $worker->id, par exemple ici, cela ne lancera la connexion que dans le processus 0
    if ($worker->id != 0) {
        return;
    }
    // Définir l'adresse IP locale et le port pour accéder à l'hôte distant (chaque connexion socket occupera un port local)
    $context_option = array(
        'socket' => array(
            // l'IP doit être l'IP de la carte réseau locale et pouvoir accéder à l'hôte distant, sinon ça ne fonctionnera pas
            'bindto' => '114.215.84.87:2333',
        ),
    );

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

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

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

    $con->connect();
};

Worker::runAll();

Exemple 3, accès asynchrone à un port wss externe, avec certificat 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){
    // Définir l'adresse IP locale, le port et le certificat SSL pour accéder à l'hôte distant
    $context_option = array(
        'socket' => array(
            // l'IP doit être l'IP de la carte réseau locale et pouvoir accéder à l'hôte distant, sinon ça ne fonctionnera pas
            'bindto' => '114.215.84.87:2333',
        ),
        // options SSL, voir https://php.net/manual/zh/context.ssl.php
        'ssl' => array(
            // Chemin du certificat local. Doit être au format PEM et inclure le certificat local ainsi que la clé privée.
            'local_cert'        => '/your/path/to/pemfile',
            // Mot de passe du fichier local_cert.
            'passphrase'        => 'your_pem_passphrase',
            // Accepter les certificats auto-signés.
            'allow_self_signed' => true,
            // Nécessite une vérification du certificat SSL.
            'verify_peer'       => false
        )
    );

    // Initiation de la connexion asynchrone
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // Définit l'accès en utilisant la méthode de chiffrement SSL
    $con->transport = 'ssl';

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

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

    $con->connect();
};

Worker::runAll();