ในฐานะ 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();