Metodo __construct
void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)
Crea un oggetto di connessione asincrona.
AsyncTcpConnection consente a Workerman di avviare una connessione asincrona come client verso un server remoto e di inviare e gestire i dati sulla connessione in modo asincrono tramite l'interfaccia send e il callback onMessage.
Parametri
Parametro:remote_address
L'indirizzo della 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 specificare quale IP (scheda di rete) e porta utilizzare per accedere alla rete esterna, impostare il certificato ssl, ecc.
Riferimenti stream_context_create, opzioni del contesto del socket, opzioni del contesto SSL
Attenzione
Attualmente, i protocolli supportati da AsyncTcpConnection sono tcp, ssl, ws, frame, text.
Supporta anche protocolli personalizzati, vedere 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.
Puoi utilizzare new AsyncTcpConnection('ws://...') per avviare una connessione websocket al server websocket remoto come in un browser, vedere esempio. Tuttavia, non puoi 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();
// All'avvio del processo, crea asincronamente un oggetto di connessione a www.baidu.com e invia dati per ottenere dati
$task->onWorkerStart = function($task)
{
// Non supporta l'indicazione diretta di http, ma puoi simulare il protocollo http utilizzando tcp per inviare dati
$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 riuscita\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 msg:$msg\n";
};
$connection_to_baidu->connect();
};
// Esegui il worker
Worker::runAll();
Esempio 2, Accesso asincrono a un servizio websocket esterno e impostazione dell'IP locale e della porta per accedere
<?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 vuoi avviare la connessione solo in un processo, puoi farlo controllando $worker->id, ad esempio, sotto è solo per avviare la connessione nel processo 0
if ($worker->id != 0) {
return;
}
// Imposta l'IP locale e la porta per accedere all'host remoto (ogni connessione socket occuperà una porta locale)
$context_option = array(
'socket' => array(
// L'IP deve essere l'IP della scheda di rete locale e deve poter accedere all'host remoto, altrimenti è inefficace
'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();
Esempio 3, Accesso asincrono a una porta wss esterna e impostazione 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 locale e la porta per accedere all'host remoto e il certificato SSL
$context_option = array(
'socket' => array(
// L'IP deve essere l'IP della scheda di rete locale e deve poter accedere all'host remoto, altrimenti è inefficace
'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 sia il certificato locale che la chiave privata.
'local_cert' => '/your/path/to/pemfile',
// Password del file local_cert.
'passphrase' => 'your_pem_passphrase',
// Se si consentono certificati autofirmati.
'allow_self_signed' => true,
// Se è necessaria la verifica del certificato SSL.
'verify_peer' => false
)
);
// Avvia la connessione asincrona
$con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);
// Imposta per accedere in modo crittografato SSL
$con->transport = 'ssl';
$con->onConnect = function(AsyncTcpConnection $con) {
$con->send('hello');
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
echo $data;
};
$con->connect();
};
Worker::runAll();