__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 สนับสนุนโปรโตคอล tcpsslwsframetext อย่างไรก็ตามยังสนับสนุนโปรโตคอลที่กำหนดเอง ดูที่ วิธีการสร้างโปรโตคอลที่กำหนดเอง

ในหมวด 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();