__construct Methode
void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)
Erstellt ein asynchrones Verbindungsobjekt.
AsyncTcpConnection ermöglicht es Workerman, als Client eine asynchrone Verbindung zu einem Remote-Server herzustellen und Daten über die Schnittstelle send und das Rückruf-Event onMessage asynchron zu senden und zu verarbeiten.
Parameter
Parameter: remote_address
Die Adresse, mit der verbunden werden soll, zum Beispiel
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
Parameter: $context_option
Dieser Parameter ist erforderlich (workerman >= 3.3.5)
Dient zur Einstellung des Socket-Kontexts, z. B. um mit bindto festzulegen, über welche (Netzwerk-)IP und den Port auf das externe Netzwerk zugegriffen wird, SSL-Zertifikate festzulegen usw.
Siehe stream_context_create, Socket-Kontextoptionen, SSL-Kontextoptionen
Hinweis
Derzeit unterstützte Protokolle von AsyncTcpConnection sind tcp, ssl, ws, frame, text.
Es wird auch die Anpassung von Protokollen unterstützt, siehe So passen Sie Protokolle an.
Das ssl Protokoll erfordert Workerman>=3.3.4 und die Installation der openssl-Erweiterung.
Derzeit wird das http Protokoll von AsyncTcpConnection nicht unterstützt.
Sie können new AsyncTcpConnection('ws://...') verwenden, um wie im Browser eine Websocket-Verbindung zu einem Remote-Websocket-Server in Workerman herzustellen, siehe Beispiel. Es ist jedoch nicht möglich, eine Websocket-Verbindung in Workerman mit new AsyncTcpConnection('websocket://...') herzustellen.
Beispiele
Beispiel 1, asynchrone Verbindung zu externem HTTP-Dienst
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
// Asynchrone Erstellung eines Verbindungsobjekts zu www.baidu.com und Senden sowie Empfangen von Daten beim Start des Prozesses
$task->onWorkerStart = function($task)
{
// Es wird nicht unterstützt, http direkt anzugeben, aber es kann verwendet werden, um das http-Protokoll über tcp zu simulieren und Daten zu senden
$connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
// Wenn die Verbindung erfolgreich hergestellt wurde, HTTP-Anfragedaten senden
$connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
{
echo "Verbindung erfolgreich\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 "Verbindung geschlossen\n";
};
$connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
{
echo "Fehlercode:$code Nachricht:$msg\n";
};
$connection_to_baidu->connect();
};
// Worker ausführen
Worker::runAll();
Beispiel 2, asynchrone Verbindung zu externem Websocket-Dienst und lokale IP sowie Port festlegen
<?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) {
// Wenn Sie möchten, dass die Verbindung nur in einem Prozess herstellt wird, können Sie dies durch Überprüfung von $worker->id tun, z. B. oben, damit die Verbindung nur im Prozess 0 hergestellt wird
if ($worker->id != 0) {
return;
}
// Legen Sie die lokale IP und den Port für die Verbindung zum Remote-Host fest (jede Socket-Verbindung belegt einen lokalen Port)
$context_option = array(
'socket' => array(
// IP muss die lokale Netzwerk-IP sein und auf den Remote-Host zugreifen können, andernfalls ist es ungültig
'bindto' => '114.215.84.87:2333',
),
);
$con = new AsyncTcpConnection('ws://echo.websocket.org:80', $context_option);
$con->onConnect = function(AsyncTcpConnection $con) {
$con->send('hallo');
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
echo $data;
};
$con->connect();
};
Worker::runAll();
Beispiel 3, asynchrone Verbindung zu externem WSS-Port und lokale SSL-Zertifikate festlegen
<?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){
// Legen Sie die lokale IP, den Port und die SSL-Zertifikate fest
$context_option = array(
'socket' => array(
// IP muss die lokale Netzwerk-IP sein und auf den Remote-Host zugreifen können, andernfalls ist es ungültig
'bindto' => '114.215.84.87:2333',
),
// SSL-Optionen, siehe https://php.net/manual/zh/context.ssl.php
'ssl' => array(
// Pfad zum lokalen Zertifikat. Muss im PEM-Format vorliegen und sowohl das lokale Zertifikat als auch den privaten Schlüssel enthalten.
'local_cert' => '/your/path/to/pemfile',
// Passwort der local_cert-Datei.
'passphrase' => 'your_pem_passphrase',
// Ob selbstsignierte Zertifikate erlaubt sind.
'allow_self_signed' => true,
// Ob die Überprüfung des SSL-Zertifikats erforderlich ist.
'verify_peer' => false
)
);
// Asynchrone Verbindung herstellen
$con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);
// Eine SSL-verschlüsselte Verbindung herstellen
$con->transport = 'ssl';
$con->onConnect = function(AsyncTcpConnection $con) {
$con->send('hallo');
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
echo $data;
};
$con->connect();
};
Worker::runAll();