__construct 方法
void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)
สร้างวัตถุการเชื่อมต่อแบบอะซิงโครนัส
AsyncTcpConnection ช่วยให้ Workerman ทำหน้าที่เป็นไคลเอนต์ในการเชื่อมต่อแบบอะซิงโครนัสไปยังเซิร์ฟเวอร์ระยะไกล และสามารถส่งและจัดการข้อมูลบนการเชื่อมต่ออย่างอะซิงโครนัสผ่านทางอินเทอร์เฟซ send และการเรียกกลับ onMessage
พารามิเตอร์
พารามิเตอร์: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
พารามิเตอร์:$context_option
พารามิเตอร์นี้จำเป็น (workerman >= 3.3.5)
ใช้สำหรับตั้งค่าบริบทของ socket เช่น การใช้bindtoเพื่อกำหนดว่าจะแก้ไข (การ์ดเครือข่าย) ip และพอร์ตใดในการเข้าถึงเครือข่ายภายนอก รวมถึงการตั้งค่าใบรับรอง ssl ด้วย
ดูเพิ่มเติมที่ stream_context_create、 ตัวเลือกบริบทของซ็อกเก็ต、ตัวเลือกบริบท SSL
หมายเหตุ
ปัจจุบัน AsyncTcpConnection สนับสนุนโปรโตคอล tcp、ssl、ws、frame、text อย่างไรก็ตามยังสนับสนุนโปรโตคอลที่กำหนดเอง ดูที่ วิธีการสร้างโปรโตคอลที่กำหนดเอง
ในหมวด ssl ต้องการ Workerman>=3.3.4 และติดตั้ง openssl โอเวอร์ไดร์ฟ。
ปัจจุบันไม่สนับสนุน AsyncTcpConnection โปรโตคอล http。
สามารถใช้new AsyncTcpConnection('ws://...')ในการเริ่มการเชื่อมต่อเว็บซอคเก็ตกับเซิร์ฟเวอร์เว็บซอคเก็ตระยะไกลใน Workerman ได้ เช่นเดียวกับที่ทำในเบราว์เซอร์ ดู ตัวอย่าง。แต่ไม่สามารถเริ่มการเชื่อมต่อเว็บซอคเก็ตใน Workerman ในรูปแบบnew AsyncTcpConnection('websocket://...')ได้
ตัวอย่าง
ตัวอย่าง 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)
{
// ไม่สนับสนุนการระบุ 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:$msg\n";
};
$connection_to_baidu->connect();
};
// เรียกใช้งาน worker
Worker::runAll();
ตัวอย่าง 2, การเข้าถึงบริการ websocket ภายนอกอย่างอะซิงโครนัส และตั้งค่าที่จะใช้ ip และพอร์ตท้องถิ่นในกระบวนการ
<?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) {
// หากคุณต้องการเชื่อมต่อในกระบวนการเดียว สามารถทำได้โดยการตรวจสอบ $worker->id เช่นในด้านล่างนี้จะเชื่อมต่อในกระบวนการ 0 เท่านั้น
if ($worker->id != 0) {
return;
}
// ตั้งค่าที่ ip และพอร์ตท้องถิ่นที่ใช้งานในการเข้าถึงโฮสต์เป้าหมาย (แต่ละการเชื่อมต่อ socket จะใช้พอร์ตในท้องถิ่น)
$context_option = array(
'socket' => array(
// ip ต้องเป็น ip ของการ์ดเครือข่ายภายใน และเข้าถึงโฮสต์เป้าหมายได้ มิฉะนั้นจะไม่ถูกต้อง
'bindto' => '114.215.84.87:2333',
),
);
$con = new AsyncTcpConnection('ws://echo.websocket.org:80', $context_option);
$con->onConnect = function(AsyncTcpConnection $con) {
$con->send('สวัสดี');
};
$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){
// ตั้งค่าที่ ip และพอร์ตท้องถิ่นที่ใช้ในการเข้าถึงโฮสต์เป้าหมาย รวมถึงใบรับรอง ssl
$context_option = array(
'socket' => array(
// ip ต้องเป็น ip ของการ์ดเครือข่ายภายใน และเข้าถึงโฮสต์เป้าหมายได้ มิฉะนั้นจะไม่ถูกต้อง
'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('สวัสดี');
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
echo $data;
};
$con->connect();
};
Worker::runAll();