国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【備忘】thinkphp5.1之websocket長連接框架使用流程簡述

這篇具有很好參考價(jià)值的文章主要介紹了【備忘】thinkphp5.1之websocket長連接框架使用流程簡述。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

本文純屬經(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)的文件

<?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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用Docker Dockerfile構(gòu)建php LNMP集成開發(fā)環(huán)境,并運(yùn)行Thinkphp5

    使用Docker Dockerfile構(gòu)建php LNMP集成開發(fā)環(huán)境,并運(yùn)行Thinkphp5

    系統(tǒng):MAC、Windows10 Docker版本:Docker version 23.0.5 Docker Desktop:Dockerdesktop官方地址 這篇主要介紹如何在Mac、Windows10使用docker搭建LNMP集成開發(fā)環(huán)境。下面我會(huì)寫Dockerfile編譯安裝Nginx+php基礎(chǔ)環(huán)境。mysql、redis基于官方Docker hub,分別構(gòu)建我們自己的鏡像。 ?code目錄存放工程代碼,會(huì)映

    2024年02月15日
    瀏覽(60)
  • thinkphp6和thinkphp5有什么區(qū)別

    Thinkphp6.0完全開發(fā)手冊 采用PHP7強(qiáng)類型(嚴(yán)格模式) tp5 環(huán)境要求PHP = 5.4.0 ThinkPHP6.0的環(huán)境要求 PHP = 7.2.5 6.0版本開始,必須通過Composer方式安裝和更新,所以你無法通過Git下載安裝。 支持更多的PSR規(guī)范 V6.0.10版本開始 支持 psr7 response 多應(yīng)用支持 tp5默認(rèn)使用多應(yīng)用模式部署 tp6 安

    2024年02月06日
    瀏覽(21)
  • thinkphp5攔截驗(yàn)證token

    寫一個(gè)BaseController 類 基本思路: 1、繼承一個(gè)公共基類,將驗(yàn)證相關(guān)代碼放在基類 2、根據(jù) 孩子類下的notNeedToken 來決定是否進(jìn)行驗(yàn)證 3、驗(yàn)證失敗后,直接響應(yīng)回來 這里需要封裝一個(gè)主要代碼: 如果直接return 返回,是不會(huì)終止執(zhí)行的,而是會(huì)繼續(xù)執(zhí)行到指定的控制器,所以

    2024年02月15日
    瀏覽(22)
  • thinkPhp5返回某些指定字段

    thinkPhp5返回某些指定字段

    或者指定要的字段的數(shù)組? 查詢符合條件的多條數(shù)據(jù) ?

    2024年02月09日
    瀏覽(27)
  • ThinkPHP5遠(yuǎn)程命令執(zhí)行漏洞

    ThinkPHP5遠(yuǎn)程命令執(zhí)行漏洞

    ThinkPHP是一個(gè)快速、兼容而且簡單的輕量級國產(chǎn) PHP開發(fā)框架?,誕生于2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,遵循Apache2開源協(xié)議發(fā)布,使用面向?qū)ο蟮拈_發(fā)結(jié)構(gòu)和 MVC模式 ,從Struts結(jié)構(gòu)移植過來并做了改進(jìn)和完善,同時(shí)也借鑒了國外很多優(yōu)秀的框架和模式。 由于th

    2024年02月11日
    瀏覽(25)
  • Thinkphp5.x全漏洞復(fù)現(xiàn)分析

    Thinkphp5.x全漏洞復(fù)現(xiàn)分析

    我們可以把namespace理解為一個(gè)單獨(dú)的空間,事實(shí)上它也就是一個(gè)空間而已,子命名空間那就是空間里再劃分幾個(gè)小空間,舉個(gè)例子: 當(dāng)有多個(gè)子命名空間有相同名稱類時(shí),不指定使用哪個(gè)命名空間的情況下取最后定義的命名空間中的類,比如上面的 dog 取的時(shí) dogC 中的類,在

    2024年04月22日
    瀏覽(25)
  • ThinkPHP5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

    ThinkPHP5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

    ThinkPHP 是一款運(yùn)用極廣的 PHP 開發(fā)框架。其 5.0.23 以前的版本中,獲取 method 的方法中沒有正確處理方法名,導(dǎo)致攻擊者可以調(diào)用 Request 類任意方法并構(gòu)造利用鏈,從而導(dǎo)致遠(yuǎn)程代碼執(zhí)行漏洞。 百度漏洞 獲得exp 路徑: POST傳參 我用的是hackbar,用burpsuite也行。 burp操作方法 抓包

    2024年02月11日
    瀏覽(23)
  • ThinkPHP5.0.21遠(yuǎn)程命令執(zhí)行漏洞

    ThinkPHP5.0.21遠(yuǎn)程命令執(zhí)行漏洞

    漏洞出現(xiàn)的背景 : ThinkPHP是?款運(yùn)?極?的PHP開發(fā)框架。 其5.0.23以前的版本中,獲取method的?法中沒有正確處理?法名, 導(dǎo)致攻擊者可以調(diào)?Request類任意?法并構(gòu)造利?鏈,從?導(dǎo)致遠(yuǎn)程代碼執(zhí)?漏洞。 由于ThinkPHP5框架對控制器名沒有進(jìn)??夠的安全檢測,導(dǎo)致在沒有開

    2024年02月04日
    瀏覽(23)
  • ThinkPHP5系列遠(yuǎn)程代碼執(zhí)行漏洞復(fù)現(xiàn)(詳細(xì))

    ThinkPHP5系列遠(yuǎn)程代碼執(zhí)行漏洞復(fù)現(xiàn)(詳細(xì))

    ThinkPHP是一款運(yùn)用極廣的PHP開發(fā)框架。其版本5中,由于框架對控制器名沒有進(jìn)行足夠的檢測,會(huì)導(dǎo)致在沒有開啟強(qiáng)制路由的情況下可執(zhí)行任意方法,從而導(dǎo)致遠(yuǎn)程命令執(zhí)行漏洞。 漏洞危害 啟動(dòng)環(huán)境 切換到/thinkphp/5.0.23-rce# 目錄下 將version改為2,保存并退出 接著執(zhí)行 此時(shí)環(huán)境

    2024年02月12日
    瀏覽(29)
  • 知識(shí)筆記(九十)———ThinkPHP5中時(shí)間查詢的方法

    使用 where 方法 where 方法支持時(shí)間比較,例如: 第三個(gè)參數(shù)可以傳入任何有效的時(shí)間表達(dá)式,會(huì)自動(dòng)識(shí)別你的時(shí)間字段類型,支持的時(shí)間類型包括 timestamps 、 datetime 、 date 和 int 。 使用 whereTime 方法 whereTime 方法提供了日期和時(shí)間字段的快捷查詢,示例如下: 還提供了更方便

    2024年01月21日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包