前言
本文純屬經(jīng)驗(yàn)備注,有許多地方未進(jìn)行測試,請勿照搬,僅供參考。
之前專門花了幾天時(shí)間測試了websocket,當(dāng)時(shí)只記得踩了許多坑,但是沒有對測試流程進(jìn)行記錄,導(dǎo)致長時(shí)間未使用從而無從下手。
今天就簡單記錄一下使用流程。
環(huán)境介紹
- php7.4+
- linux
- nginx
- thinkphp5.1
- workerman
流程
1、安裝長連接框架:composer require workerman/gateway-worker
2、配置基本參數(shù)
配置文件為 config/gateway_worker.php(必須使用對應(yīng)命令才能啟動(dòng))
配置端口startPort,pingData,eventHandler,其它默認(rèn)就好
eventHandler配置為app\index\logic\events\Events.php類,用于處理監(jiān)聽后的業(yè)務(wù)邏輯
3、啟動(dòng)服務(wù)
唯一啟動(dòng)命令:php think worker:gateway
4、nginx服務(wù)配置以支持/wss方式訪問
參考配置:
location /wss
{
proxy_pass http://127.0.0.1:2000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
5、JavaScript客戶端建立連接并訪問
ws = new WebSocket("wss://bootest.playtest.top/wss");//這種訪問方式需要nginx配置
ws.onopen = function() {
alert("連接成功");
ws.send('hello,thinkphp');
alert("給服務(wù)端發(fā)送一個(gè)字符串:hello,thinkphp");
詳細(xì)配置參考(gateway_worker.php)
//gateway_worker.php 文件配置
<?php
// +----------------------------------------------------------------------
// | Workerman設(shè)置 僅對 php think worker:gateway 指令有效
// +----------------------------------------------------------------------
return [
/** 【長連接使用此配置,啟動(dòng)命令: php think worker:gateway 】 */
// 擴(kuò)展自身需要的配置
'protocol' => 'websocket', // 協(xié)議 支持 tcp udp unix http websocket text
'host' => '0.0.0.0', // 監(jiān)聽地址
'port' => 2000, // 監(jiān)聽端口
'socket' => '', // 完整監(jiān)聽地址
'context' => [], // socket 上下文選項(xiàng)
'register_deploy' => true, // 是否需要部署register
'businessWorker_deploy' => true, // 是否需要部署businessWorker
'gateway_deploy' => true, // 是否需要部署gateway
// Register配置
'registerAddress' => '127.0.0.1:1236',
// Gateway配置
'name' => 'thinkphp',
'count' => 1,
'lanIp' => '127.0.0.1',
'startPort' => 1350,
'daemonize' => false,
'pingInterval' => 30,
'pingNotResponseLimit' => 0,
//這里根據(jù)自己需要配置,不一定使用json
'pingData' => '{"code":"200","msg":"ok","action":"ping"}',
// BusinsessWorker配置
'businessWorker' => [
'name' => 'BusinessWorker',
'count' => 1,
// 'eventHandler' => '\think\worker\Events',
//這里配置事件監(jiān)聽后的業(yè)務(wù)邏輯處理代碼,Events.php類
'eventHandler' => 'app\index\logic\events\Events',
],
];
Events類(定制業(yè)務(wù)邏輯)
上面eventHandler類對應(yīng)的文件文章來源:http://www.zghlxwxcb.cn/news/detail-817392.html
<?php
namespace app\index\logic\events;
use app\index\logic\Baselogic;
use GatewayWorker\Lib\Gateway;
use think\worker\Application;
use wanghua\general_utility_tools_php\tool\Tools;
use Workerman\Worker;
/**
* 事件監(jiān)聽后的業(yè)務(wù)邏輯(自由定制)
*/
class Events extends \think\worker\Events
{
/**
* onWorkerStart 事件回調(diào)
* 當(dāng)businessWorker進(jìn)程啟動(dòng)時(shí)觸發(fā)。每個(gè)進(jìn)程生命周期內(nèi)都只會(huì)觸發(fā)一次
*
* @access public
* @param \Workerman\Worker $businessWorker
* @return void
*/
public static function onWorkerStart(Worker $businessWorker)
{
$app = new Application;
$app->initialize();
}
/**
* onConnect 事件回調(diào)
* 當(dāng)客戶端連接上gateway進(jìn)程時(shí)(TCP三次握手完畢時(shí))觸發(fā)
*
* @access public
* @param int $client_id
* @return void
*/
public static function onConnect($client_id)
{
//一個(gè)連接只觸發(fā)一次
Tools::log_to_write_text('客戶端完成TCP握手');
$res = Tools::set_ok('ok','onConnect',['client_id'=>$client_id]);
Gateway::sendToCurrentClient(json_encode($res,JSON_UNESCAPED_UNICODE));
}
/**
* onWebSocketConnect 事件回調(diào)
* 當(dāng)客戶端連接上gateway完成websocket握手時(shí)觸發(fā)
*
* @param integer $client_id 斷開連接的客戶端client_id
* @param mixed $data {
"get":[
],
"server":{
"REQUEST_METHOD":"GET",
"REQUEST_URI":"/wss",
"SERVER_PROTOCOL":"HTTP/1.1",
"HTTP_UPGRADE":"websocket",
"HTTP_CONNECTION":"Upgrade",
"HTTP_X_REAL_IP":"183.227.89.107",
"HTTP_HOST":"127.0.0.1:2000",
"SERVER_NAME":"127.0.0.1",
"SERVER_PORT":"2000",
"HTTP_PRAGMA":"no-cache",
"HTTP_CACHE_CONTROL":"no-cache",
"HTTP_USER_AGENT":"wechatdevtools desktopapp appservice port/62717 token/589065e467011760c777411fca2cd0aa runtime/2 MicroMessenger",
"HTTP_ORIGIN":"https://boomim.playone.cn",
"HTTP_SEC_WEBSOCKET_VERSION":"13",
"HTTP_ACCEPT_ENCODING":"gzip, deflate, br",
"HTTP_ACCEPT_LANGUAGE":"zh-CN,zh;q=0.9",
"HTTP_CONTENT_TYPE":"application/json",
"HTTP_REFERER":"https://servicewechat.com/wx55e10fb2834803d5/devtools/page-frame.html",
"HTTP_SEC_WEBSOCKET_KEY":"uWOWC1AZahJOpS18hN3ZHA==",
"HTTP_SEC_WEBSOCKET_EXTENSIONS":"permessage-deflate; client_max_window_bits",
"QUERY_STRING":""
},
"cookie":[
]
}
* @return void
*/
public static function onWebSocketConnect($client_id, $data)
{
// var_export($data);
//對應(yīng)客戶端打開連接, 一個(gè)連接只觸發(fā)一次
Tools::log_to_write_text(['客戶端打開了websocket連接',$data]);
//$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'客戶端打開連接時(shí),發(fā)送到服務(wù)端的消息:','data'=>$data]);
//
//Gateway::sendToCurrentClient(json_encode($res,JSON_UNESCAPED_UNICODE));
}
/**
* onMessage 事件回調(diào)
* 當(dāng)客戶端發(fā)來數(shù)據(jù)(Gateway進(jìn)程收到數(shù)據(jù))后觸發(fā)
*
* @access public
* @param int $client_id
* @param mixed $data
* @return void
*/
public static function onMessage($client_id, $data)
{
Tools::log_to_write_text(['客戶端發(fā)來數(shù)據(jù)(Gateway進(jìn)程收到數(shù)據(jù)).client_id:'.$client_id,$data]);
//$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'你發(fā)來的消息我接收到了:',$client_id=>$data]);
//Gateway::sendToClient($client_id,json_encode($res,JSON_UNESCAPED_UNICODE));
}
/**
* onClose 事件回調(diào) 當(dāng)用戶斷開連接時(shí)觸發(fā)的方法
*
* @param integer $client_id 斷開連接的客戶端client_id
* @return void
*/
public static function onClose($client_id)
{
//GateWay::sendToAll("client[$client_id] logout\n");
Tools::log_to_write_text(['斷開連接.client_id:'.$client_id]);
}
/**
* onWorkerStop 事件回調(diào)
* 當(dāng)businessWorker進(jìn)程退出時(shí)觸發(fā)。每個(gè)進(jìn)程生命周期內(nèi)都只會(huì)觸發(fā)一次。
*
* @param \Workerman\Worker $businessWorker
* @return void
*/
public static function onWorkerStop(Worker $businessWorker)
{
//echo "WorkerStop\n";
Tools::log_to_write_text(['businessWorker進(jìn)程退出時(shí)觸發(fā)。每個(gè)進(jìn)程生命周期內(nèi)都只會(huì)觸發(fā)一次.',$businessWorker]);
}
}
END文章來源地址http://www.zghlxwxcb.cn/news/detail-817392.html
到了這里,關(guān)于【備忘】thinkphp5.1之websocket長連接框架使用流程簡述的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!