เมธอด __construct
void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)
สร้างอ็อบเจ็กต์การเชื่อมต่อแบบไม่สามารถทำงานพร้อมกันได้
AsyncTcpConnection สามารถทำให้ Workerman ทำหน้าที่เป็นผู้ใช้เชื่อมต่อไปที่เซิร์ฟเวอร์ระยะไกลแบบไม่สามารถทำงานพร้อมกันได้ และใช้ send interface และ onMessage callback เพื่อทำการส่งและจัดการข้อมูลที่เชื่อมต่อแบบไม่สามารถทำงานพร้อมกัน
อาร์กิวเม้นต์
Parameter: remote_address
ที่อยู่ที่เชื่อมต่อ เช่น
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
ต้องใช้พารามิเตอร์นี้ (workerman >= 3.3.5)
ใช้เพื่อตั้งค่า socket context เช่น การใช้ bindto
ตั้งค่าให้ใช้ (เครือข่ายการ์ด) ip และพอร์ตเมื่อต้องการเข้าถึงเครือข่ายภายนอก การตั้งค่า SSL ฯลฯ
สามารถอ้างอิงได้ที่ stream_context_create และ socket context options และ SSL context options
คำแนะนำ
ในปัจจุบัน AsyncTcpConnection รองรับโปรโตคอล tcp และ ssl และ ws และ frame และ text
รองรับโปรโตคอลที่กำหนดเอง โปรดดูที่ วิธีกำหนดโปรโตคอลเอง
โปรโตคอล ssl ต้องใช้ Workerman >= 3.3.4 และติดตั้ง openssl extension
ปัจจุบันไม่รองรับโปรโตคอล http ของ AsyncTcpConnection
สามารถใช้ new AsyncTcpConnection('ws://...')
เหมือนเป็นเบราว์เซอร์เพื่อสร้างการเชื่อมต่อ websocket ไปยังเซิร์ฟเวอร์ websocket ระยะไกลใน Workerman ดูตัวอย่างได้ที่ ตัวอย่าง แต่ไม่สามารถใช้ new AsyncTcpConnection('websocket://...')
เพื่อสร้างการเชื่อมต่อ websocket ใน Workerman ได้
ตัวอย่าง
ตัวอย่าง 1: เข้าถึงบริการ http ภายนอกโดยแบบไม่สะดุดตา
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
// เมื่อเริ่มกระบวนการ จะส่งการเชื่อมต่อแบบไม่สะดุดตาไปยัง www.baidu.com และส่งข้อมูลเพื่อรับข้อมูล
$task->onWorkerStart = function($task)
{
// ไม่ support http โดยตรง แต่สามารถใช้ tcp จำลองการส่งข้อมูลโปรโตคอล http
$connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
// เมื่อเชื่อมต่อสำเร็จ ส่งข้อมูลคำขอ http
$connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
{
echo "เชื่อมต่อสำเร็จ\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 "การเชื่อมต่อปิด\n";
};
$connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
{
echo "รหัสข้อผิดพลาด: $code ข้อความ: $msg\n";
};
$connection_to_baidu->connect();
};
// รัน worker
Worker::runAll();
ตัวอย่าง 2: เข้าถึงบริการ websocket ภายนอกโดยแบบไม่สะดุดตา และกำหนดไอพีและพอร์ตโดยใช้
<?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){
// กำหนดไอพีและพอร์ตของโฮสต์เราที่จะเข้าถึง (แต่ละการเชื่อมต่อ socket จะใช้พอร์ตโฮสต์เราหนึ่ง)
$context_option = array(
'socket' => array(
// ไอพี ต้องเป็นไอพีของการ์ดเน็ตเวิร์กของเครื่องเรา และสามารถเข้าถึงโฮสต์เป้าหมายได้มิฉะนั้นไม่สามารถใช้งาน
'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();
ตัวอย่าง 3: เข้าถึงพอร์ต wss ภายนอกโดยแบบไม่สะดุดตา และกำหนดใบรับรอง ssl ภายใน
<?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){
// ระบุไอพีและพอร์ตของโฮสต์เป้าหมายและใบรับรอง ssl ภายใน
$context_option = array(
'socket' => array(
// ไอพี ต้องเป็นไอพีของการ์ดเน็ตเวิร์กของเครื่องเรา และสามารถเข้าถึงโฮสต์เป้าหมายได้มิฉะนั้นไม่สามารถใช้งาน
'bindto' => '114.215.84.87:2333',
),
// ตัวเลือก ssl โปรดดูที่ https://php.net/manual/zh/context.ssl.php
'ssl' => array(
// เส้นทางของใบรับรองท้องถิ่น ต้องเป็นรูปแบบ PEM และประกอบด้วยใบรับรองท้องถิ่นและกุญแจส่วนตัวของเรา
'local_cert' => '/your/path/to/pemfile',
// รหัสผ่านของไฟล์ local_cert
'passphrase' => 'your_pem_passphrase',
// อนุญาตให้ใช้ใบรับรองสำหรับตนเองหรือไม่
'allow_self_signed' => true,
// ต้องการตรวจสอบใบรับรอง SSL หรือไม่
'verify_peer' => false
)
);
// เริ่มการเชื่อต่อแบบไม่สะดุดตา
$con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);
// กำหนดวิธีการเข้าถึงแบบ ssl
$con->transport = 'ssl';
$con->onConnect = function(AsyncTcpConnection $con) {
$con->send('hello');
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
echo $data;
};
$con->connect();
};
Worker::runAll();