ในฐานะ ws/wss คลient

บางครั้งจำเป็นต้องให้ workerman ทำหน้าที่เป็นคลient เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ผ่านโปรโตคอล ws/wss และทำการโต้ตอบด้วย
下面是示例。

workerman ในฐานะ ws คลient

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker){

    $con = new AsyncTcpConnection('ws://echo.websocket.org:80');

    // เมื่อ websocket ทำการ handshake สำเร็จแล้ว
    $con->onWebSocketConnect = function(AsyncTcpConnection $con, ) {
        $con->send('hello');
    };

    // เมื่อได้รับข้อความ
    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

workerman ในฐานะ wss (ws+ssl) คลient

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // ssl ต้องเข้าถึงพอร์ต 443
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443');

    // ตั้งค่าให้เข้าถึงในรูปแบบ ssl เพื่อให้เป็น wss
    $con->transport = 'ssl';

    $con->onWebSocketConnect = function(AsyncTcpConnection $con) {
        $con->send('hello');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

workerman ในฐานะ wss (ws+ssl) คลient + ใบรับรอง ssl ท้องถิ่น

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // ตั้งค่าการเข้าถึง ip และพอร์ตของโฮสต์ของฝ่ายตรงข้ามและใบรับรอง ssl
    $context_option = array(
        // ตัวเลือก ssl, อ้างอิงจาก http://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
        )
    );

    // ssl ต้องเข้าถึงพอร์ต 443
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // ตั้งค่าให้เข้าถึงในรูปแบบ ssl เพื่อให้เป็น wss
    $con->transport = 'ssl';

    $con->onWebSocketConnect = function(AsyncTcpConnection $con) {
        $con->send('hello');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

การตั้งค่าอื่น ๆ

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Protocols\Ws;
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker();
// เมื่อติดตั้งโปรเซส
$worker->onWorkerStart = function()
{
    // เชื่อมต่อกับเซิร์ฟเวอร์ websocket ระยะไกลด้วยโปรโตคอล websocket
    $ws_connection = new AsyncTcpConnection("ws://127.0.0.1:1234");
    // ทุก ๆ 55 วินาที ส่ง heartbeat websocket ที่มี opcode เป็น 0x9 ไปยังเซิร์ฟเวอร์
    $ws_connection->websocketPingInterval = 55;
    // กำหนด http header ที่กำหนดเอง
    $ws_connection->headers = ['token' => 'value'];
    // ตั้งค่าประเภทข้อมูล โดยปกติจะเป็น BINARY_TYPE_BLOB สำหรับข้อความ
    $ws_connection->websocketType = Ws::BINARY_TYPE_BLOB; // BINARY_TYPE_BLOB เป็นข้อความ BINARY_TYPE_ARRAYBUFFER เป็นไบนารี
    // เมื่อ TCP ทำการ handshake เสร็จสมบูรณ์แล้ว
    $ws_connection->onConnect = function($connection){
        echo "tcp connected\n";
    };
    // เมื่อ websocket ทำการ handshake เสร็จสมบูรณ์แล้ว
    $ws_connection->onWebSocketConnect = function(AsyncTcpConnection $con, $response) {
        echo $response;
        $con->send('hello');
    };
    // เมื่อเซิร์ฟเวอร์ websocket ระยะไกลส่งข้อความมา
    $ws_connection->onMessage = function($connection, $data){
        echo "recv: $data\n";
    };
    // เมื่อเกิดข้อผิดพลาดในการเชื่อมต่อ โดยทั่วไปคือข้อผิดพลาดในการเชื่อมต่อกับเซิร์ฟเวอร์ websocket ระยะไกล
    $ws_connection->onError = function($connection, $code, $msg){
        echo "error: $msg\n";
    };
    // เมื่อการเชื่อมต่อกับเซิร์ฟเวอร์ websocket ระยะไกลถูกตัดการเชื่อมต่อ
    $ws_connection->onClose = function($connection){
        echo "connection closed and try to reconnect\n";
        // หากการเชื่อมต่อถูกตัดส่วนต่อไปจะทำการเชื่อมต่อใหม่ภายใน 1 วินาที
        $connection->reConnect(1);
    };
    // ตั้งค่าต่าง ๆ เหล่านี้เสร็จแล้ว ให้ดำเนินการเชื่อมต่อ
    $ws_connection->connect();
};
Worker::runAll();