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

TP6 + GatewayWorker 輕松實現(xiàn)web項目 websocket 功能

這篇具有很好參考價值的文章主要介紹了TP6 + GatewayWorker 輕松實現(xiàn)web項目 websocket 功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、在tp6項目下安裝? GatewayWorker?

composer require topthink/think-worker
composer require workerman/gatewayclient

安裝成功后在配置文件目錄下會出現(xiàn)gateway_worker.php

gatewayworker安裝,websocket,php,gateway

開始配置gateway_worker? 下邊我貼出了我的配置文件供大家參考

return [
    // 擴展自身需要的配置
    'protocol'              => 'websocket', // 協(xié)議 支持 tcp udp unix http websocket text
    'host'                  => '127.0.0.1', // 監(jiān)聽地址
    'port'                  => 9099, // 監(jiān)聽端口
    'socket'                => '', // 完整監(jiān)聽地址
    'context'               => [], // socket 上下文選項
    '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'             => 2000,
    'daemonize'             => false,
    'pingInterval'          => 30,
    'pingNotResponseLimit'  => 1,
    'pingData'              => '{"type":"ping"}',

    // BusinsessWorker配置
    'businessWorker'        => [
        'name'         => 'BusinessWorker',
        'count'        => 1,
        'eventHandler' => 'app\common\service\WsEventService',
    ],

];

?下面對gateway 配置部分的屬性解釋

name :?可以設置Gateway進程的名稱,方便status命令中查看統(tǒng)計

count :可以設置Gateway進程的數(shù)量,以便充分利用多cpu資源

lanIp :lanIp是Gateway所在服務器的內網(wǎng)IP,如果不做多服務器分布式部署的話默認填寫127.0.0.1即可

startPort :官方文檔是這樣說的??Gateway進程啟動后會監(jiān)聽一個本機端口,用來給BusinessWorker提供鏈接服務,然后Gateway與BusinessWorker之間就通過這個連接通訊。這里設置的是Gateway監(jiān)聽本機端口的起始端口。比如啟動了4個Gateway進程,startPort為2000,則每個Gateway進程分別啟動的本地端口一般為2000、2001、2002、2003。

官方的話比較繞,其實就可以理解為一下配置了? N個端口? 起始端口是 你配置的端口號 至于會啟動多少個完全取決你配置的工作進程數(shù) "count"

?registerAddress : 注冊服務地址

daemonize : 是否以守護進程模式啟動(linux下有效?)

pingInterval :心跳間隔時間

pingNotResponseLimit :?服務端是否允許客戶端不發(fā)送心跳 如果配置為0則服務端允許客戶端不發(fā)心跳 ,如果配置為1 客戶端必須要在心跳間隔時間(pingInterval)內發(fā)送心跳到服務器否則服務器會判定客戶端斷開而終端連接觸發(fā)onclose事件。

pingData : 如果pingData 不是空字符串則服務器會在心跳間隔時間(pingInterval)向客戶端發(fā)送心跳數(shù)據(jù)

PS:GatewayWorker 通過pingInterval、pingNotResponseLimit、pingData? 這三個配置實現(xiàn)了心跳檢測機制 ,詳情請參見官方文檔心跳檢測部分?心跳檢測-gateway-worker手冊

下面對??businessWorker 的配置進行講解

name :businessWorker啟動的進程名

count :businessWorker啟動的工作進程數(shù)

eventHandler :?businessWorker 的事件類(這里要寫完整的命名空間)

以下是eventHandler 的示例代碼

namespace app\common\service;

use GatewayWorker\Lib\Gateway;

class WsEventService{

    public static function onConnect($client_id)
    {
        Gateway::sendToCurrentClient("Your client_id is $client_id");
    }

    public static function onMessage($client_id , $data){
        Gateway::sendtoCurrentClient("client_id: $client_id -> "."data => $data");
    }

}

當然這里還可以配置更多的事件 詳情請參照官方文檔的Events類的回調屬性-gateway-worker手冊

至此我們就可以啟動 gateway了

php think worker:gateway

如果你是在windows下會報錯??

gatewayworker安裝,websocket,php,gateway

這里不支持windows環(huán)境并不是說gateway worker不支持windows,而是tp的命令行運行方式不支持windows,原因是(在官方文檔中有說明)

?gatewayworker安裝,websocket,php,gateway

?官方文檔說要分別創(chuàng)建三個php文件分別啟動?gateway、register、businessworker服務

我們這里可以通過一個TP自定義命令行搞定 繼續(xù)上代碼!

<?php

declare(strict_types=1);

namespace app\command;

use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Config;
use Workerman\Worker;

class WebSocket extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('wserver')
            ->addArgument('service', Argument::OPTIONAL, 'workerman service: gateway|register|businessworker', null)
            ->addOption('host', 'H', Option::VALUE_OPTIONAL, 'the host of workerman server', null)
            ->addOption('port', 'P', Option::VALUE_OPTIONAL, 'the port of workerman server', null)
            ->addOption('daemon', 'd', Option::VALUE_OPTIONAL, 'Run the workerman server in daemon mode.')
            ->setDescription('workerman Server for ThinkPHP');
    }

    protected function execute(Input $input, Output $output)
    {
        $service = $input->getArgument('service');

        $option = Config::get('gateway_worker');

        if ($input->hasOption('host')) {
            $host = $input->getOption('host');
        } else {
            $host = !empty($option['host']) ? $option['host'] : '0.0.0.0';
        }

        if ($input->hasOption('port')) {
            $port = $input->getOption('port');
        } else {
            $port = !empty($option['port']) ? $option['port'] : '2347';
        }

        $registerAddress = !empty($option['registerAddress']) ? $option['registerAddress'] : '127.0.0.1:1236';
        switch ($service) {
            case 'register':
                $this->register($registerAddress);
                break;
            case 'businessworker':
                $this->businessWorker($registerAddress, isset($option['businessWorker']) ? $option['businessWorker'] : []);
                break;
            case 'gateway':
                $this->gateway($registerAddress, $host, $port, $option);
                break;
            default:
                $output->writeln("<error>Invalid argument action:{$service}, Expected gateway|register|businessworker .</error>");
                exit(1);
                break;
        }

        Worker::runAll();
    }

    /**
     * 啟動register
     * @access public
     * @param  string   $registerAddress
     * @return void
     */
    public function register($registerAddress)
    {
        // 初始化register
        new Register('text://' . $registerAddress);
    }

    /**
     * 啟動businessWorker
     * @access public
     * @param  string   $registerAddress registerAddress
     * @param  array    $option 參數(shù)
     * @return void
     */
    public function businessWorker($registerAddress, $option = [])
    {
        // 初始化 bussinessWorker 進程
        $worker = new BusinessWorker();

        $this->option($worker, $option);

        $worker->registerAddress = $registerAddress;
    }

    /**
     * 啟動gateway
     * @access public
     * @param  string   $registerAddress registerAddress
     * @param  string   $host 服務地址
     * @param  integer  $port 監(jiān)聽端口
     * @param  array    $option 參數(shù)
     * @return void
     */
    public function gateway($registerAddress, $host, $port, $option = [])
    {
        // 初始化 gateway 進程
        if (!empty($option['socket'])) {
            $socket = $option['socket'];
            unset($option['socket']);
        } else {
            $protocol = !empty($option['protocol']) ? $option['protocol'] : 'websocket';
            $socket   = $protocol . '://' . $host . ':' . $port;
            unset($option['host'], $option['port'], $option['protocol']);
        }

        $gateway = new Gateway($socket, isset($option['context']) ? $option['context'] : []);

        // 以下設置參數(shù)都可以在配置文件中重新定義覆蓋
        $gateway->name                 =  'Gateway';
        $gateway->count                = 4;
        $gateway->lanIp                = '127.0.0.1';
        $gateway->startPort            = 2000;
        $gateway->pingInterval         = 10;
        $gateway->pingNotResponseLimit = 1;
        $gateway->pingData             = '{"type":"ping"}';
        $gateway->registerAddress      = $registerAddress;

        // 全局靜態(tài)屬性設置
        foreach ($option as $name => $val) {
            if (in_array($name, ['stdoutFile', 'daemonize', 'pidFile', 'logFile'])) {
                Worker::${$name} = $val;
                unset($option[$name]);
            }
        }

        $this->option($gateway, $option);
    }

    /**
     * 設置參數(shù)
     * @access protected
     * @param  Worker   $worker Worker對象
     * @param  array    $option 參數(shù)
     * @return void
     */
    protected function option($worker, array $option = [])
    {
        // 設置參數(shù)
        if (!empty($option)) {
            foreach ($option as $key => $val) {
                $worker->$key = $val;
            }
        }
    }
}

下邊我們就可以通過運行這個tp自定義命令來分別啟動三個服務

php think wserver register   //啟動 register服務
php think wserver businessworker //啟動 businessworker服務
php think wserver gateway //啟動 gateway服務

這樣我們需要在windows上打開三個cmd窗體分別執(zhí)行這三條命令 如果嫌麻煩的話可以編輯個bat腳本一次啟動這三個服務, 將下邊代碼保存成 xxx.bat 就可以了

start php think wserver register
start php think wserver businessworker
start php think wserver gateway

最后執(zhí)行這個bat腳本就可以了(通過命令行執(zhí)行或者雙擊執(zhí)行都可以)

gatewayworker安裝,websocket,php,gateway

?到這里我們就可以在tp6項目中任何一個地方通過調用 GatewayWorker\Lib\Gateway 類的方法向客戶端推送消息了 詳情請參見官方文檔??Lib/Gateway類提供的接口-gateway-worker手冊

Gateway::sendToClient($client_id,$message);

windows 啟動服務部分參照了? 八戒王的博客《GatewayWorker Not Support On Windows.》 特此鳴謝!GatewayWorker Not Support On Windows._windows不支持 geteway_八戒王的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-722700.html

到了這里,關于TP6 + GatewayWorker 輕松實現(xiàn)web項目 websocket 功能的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • tp6安裝并使用rabbitMQ

    tp6安裝并使用rabbitMQ

    最近因為業(yè)務需要,要用到MQ就去研究了一下,說實話,安裝環(huán)境給我搞自閉了,大概是我太菜 剛開始使用yum換源,各種安裝卸載始終找不到自己要用的版本,后來全部卸載,下載安裝包 編譯安裝解百憂 我用的是erlang 25.3?的版本,MQ使用的是3.11.3的版本,符合官方要求,這里的版本是有強

    2024年02月08日
    瀏覽(101)
  • tp6 v3微信退款

    調用

    2024年02月13日
    瀏覽(97)
  • tp6用redis存儲session

    tp6用redis存儲session

    隨著業(yè)務量的增加,很多時候會需要共享session的情況。共享session,其實就是說多臺服務器共用一個session,或者是說一個主域跟多個子域之間共用一個session。工作中用tp也多一些,那么,我就用tp6來給大家講解一下。 在共享session,我們需要用到redis。這兒我假設大家都能讀懂

    2024年02月08日
    瀏覽(107)
  • TP6 對接阿里云短信接口2.0

    TP6 對接阿里云短信接口2.0

    首先下載 安裝阿里云短信SDK composer require alibabacloud/sdk 安裝 Alibaba Cloud SDK for PHP 作為依賴項 composer require alibabacloud/darabonba-openapi 最后安裝對應的包 composer require alibabacloud/dysmsapi-20170525? 上面3個都下載了,官方網(wǎng)站并沒有說明下載 sdk,這個沒有下載,查詢資料花了幾個小時,

    2024年02月16日
    瀏覽(104)
  • TP6----------阿里云短信包驗證碼登錄

    首先開通阿里云短信包,之后申請短信包簽名,這里大家自行去阿里云申請 安裝阿里云sdk 首先創(chuàng)建Sample類方便調用,我們需要有短信簽名,簽名模板,阿里云keyId和accessKeySecret 阿里云key在阿里云首頁,右上角有個acesskey管理就可以看到 Sample.php文件 業(yè)務邏輯層生成隨機驗證碼

    2024年02月15日
    瀏覽(93)
  • tp6 rules內置驗證規(guī)則thinkphp

    1、驗證某個字段必須:‘name’=‘require’ 2、驗證某個字段的值是否為純數(shù)字:‘num’=‘number’ 3、驗證某個字段的值是否為整數(shù):‘num’=‘integer’ 4、驗證某個字段的值是否為浮點數(shù)字:‘num’=‘float’ 5、驗證某個字段的值是否為布爾值:‘num’=‘boolean’ 6、驗證某個字

    2024年04月28日
    瀏覽(102)
  • tp6怎么做阿里云OSS存儲呢?

    tp6怎么做阿里云OSS存儲呢?

    作者:陳業(yè)貴 華為云享專家 51cto(專家博主 明日之星 TOP紅人) 阿里云專家博主 阿里云oss存儲是得買的。買后,還要獲取參數(shù)。填入代碼中就可以啦 獲得四個參數(shù): $accessKeyId $accessKeySecret $endpoint $bucket 不然不對了哈 告訴你怎么做阿里云OSS存儲.

    2024年02月15日
    瀏覽(28)
  • TP6 使用閉合語句查詢多個or的模型語句

    需要傳入?yún)?shù)查詢的,可以參照下面的: ? ? ? ? 查詢出學校名稱和昵稱中有中學的所有學校

    2024年02月11日
    瀏覽(27)
  • web網(wǎng)頁端使用webSocket實現(xiàn)語音通話功能(SpringBoot+VUE)

    web網(wǎng)頁端使用webSocket實現(xiàn)語音通話功能(SpringBoot+VUE)

    最近在寫一個web項目,需要實現(xiàn)web客戶端之間的語音通話,期望能夠借助webSocket全雙工通信的方式來實現(xiàn),但是網(wǎng)上沒有發(fā)現(xiàn)可以正確使用的代碼。網(wǎng)上能找到的一個代碼使用之后 只能聽到“嘀嘀嘀”的雜音 解決方案: 使用Json來傳遞數(shù)據(jù)代替原有的二進制輸入輸出流 技術

    2024年02月02日
    瀏覽(61)
  • tp6的runtime/Logs目錄下產(chǎn)生大量日記文件,怎么取消自動生成?

    tp6的runtime/Logs目錄下產(chǎn)生大量日記文件,怎么取消自動生成?

    一開始查了好多網(wǎng)上提供的,很幸運都是抄襲別人的,沒一個成功,最后無奈只能自己解決方法 其實很簡單,不用修改config/log.php文件,沒用因為只要有登入錯誤,警告,消息或者sql錯誤都會寫入 解決方法: 關閉調試模式 配置數(shù)據(jù)庫文件 ?.env文件 true改為false即可 ?總結:

    2024年02月16日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包