国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

如何利用workerman充當(dāng)ws客戶端,然后動(dòng)態(tài)的創(chuàng)建客戶端數(shù)量

864328615

截圖

如上圖,我有個(gè)需求,就是我有個(gè)用戶表,后臺(tái)新增一個(gè)用戶,就在workerman里為這個(gè)用戶新建一個(gè)websocket鏈接,現(xiàn)在計(jì)劃的是在進(jìn)程啟動(dòng)時(shí) 先啟動(dòng)一個(gè)http端口,后臺(tái)新增用戶了就帶著用戶信息請(qǐng)求http服務(wù),然后服務(wù)里根據(jù)傳過來的用戶信息為用戶創(chuàng)建websocket鏈接,現(xiàn)在問題來了,怎么存儲(chǔ)websocket的實(shí)例呢,搜到有人遇到同樣的問題,看他是用$_SESSION,但是這個(gè)被作者說了不行

1226 2 0
2個(gè)回答

walkor 打賞

弄個(gè)類,存儲(chǔ)在靜態(tài)變量里就行了

class MyConnections {
    public static connections = [];
}

存的時(shí)候

MyConnections::connection[標(biāo)記] = $connection;

起始按照你截圖的用法,存$connection沒什么意義。

  • 暫無評(píng)論
864328615
class Worker extends Server
{
    protected $processes = 1;

    protected function init()
    {
        $ws = new \Workerman\Worker('websocket://0.0.0.0:2000');
        // 啟動(dòng)4個(gè)進(jìn)程對(duì)外提供服務(wù)
        $ws->count = 1;
        $ws->onConnect = function (TcpConnection $connection){
        };

        $ws->onMessage = function (TcpConnection $connection,$data) {
            $connection->send('aaaa');
        };
        $ws->onClose = function (TcpConnection $connection) {
            var_dump('ws斷開');
        };

        parent::init(); // TODO: Change the autogenerated stub
    }

    public static $i = 0;

    /**
     * http服務(wù)
     * @param $connection
     * @param $data
     */
    public function onMessage($connection, $data)
    {
        //pc管理后臺(tái)新建用戶會(huì)請(qǐng)求這個(gè)http服務(wù),收到新注冊(cè)用戶消息,為用戶創(chuàng)建ws鏈接
//        var_dump($data['get']['ws_url']);
        $con = new AsyncTcpConnection('ws://127.0.0.1:2000');

        //開始鏈接
        $con->onConnect = function ($con) {

        };

        //鏈接成功
        $con->onWebSocketConnect = function (AsyncTcpConnection $connection) {
            $connection->uid = ++ self::$i;
            //1更新用戶在線狀態(tài)

            //2啟動(dòng)心跳定時(shí)器
            $connection->timer_id = Timer::add(10, function () use($connection) {
                $ping = [
                    'msgId' => 122333,
                    'type'  => 'common.topic.clientheartbeat',
                    'msg'   => '',
                ];
                $connection->send(json_encode($ping, JSON_UNESCAPED_UNICODE));
            });
        };

        //收到消息
        $con->onMessage = function (AsyncTcpConnection $connection, $data) {
            var_dump($connection->uid.':收到消息');
//            $data = json_decode($data, true);
//            //服務(wù)端心跳
//            if ($data['heartbeat']) {
//                return;
//            }
//
//            $msgId = $data['msgId'];
//            switch ($data['type']) {
//                case 'authorize.topic.dismissnotify':
//                    echo '解除門店授權(quán)';
//
//                    break;
//                case 'product.topic.flowstatuschange':
//                    echo '商品狀態(tài)變更';
//
//                    break;
//                default:
//                    break;
//            }
//
//            //回復(fù)
//            $ack = [
//                'msgId' => $msgId,
//                'type'  => '',
//                'msg'   => 'ack'
//            ];
//            $connection->send(json_encode($ack, JSON_UNESCAPED_UNICODE));
        };

        //鏈接關(guān)閉
        $con->onClose = function (AsyncTcpConnection $connection) {
            echo 'onClose' . PHP_EOL;
            //1刪除心跳定時(shí)器
            if (isset($connection->timer_id)) {
                Timer::del($connection->timer_id);
            }
            //2更新用戶下線狀態(tài)
        };

        //鏈接失敗
        $con->onError = function (AsyncTcpConnection $connection, $code, $msg) {
        };

        //鏈接
        $con->connect();
    }

    /**
     * 當(dāng)連接建立時(shí)觸發(fā)的回調(diào)函數(shù)
     * @param $connection
     */
    public function onConnect($connection)
    {

    }

    /**
     * 當(dāng)連接斷開時(shí)觸發(fā)的回調(diào)函數(shù)
     * @param $connection
     */
    public function onClose($connection)
    {

    }

    /**
     * 當(dāng)客戶端的連接上發(fā)生錯(cuò)誤時(shí)觸發(fā)
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }

    /**
     * 每個(gè)進(jìn)程啟動(dòng)
     * @param $worker
     */
    public function onWorkerStart($worker)
    {

    }
}

截圖
大佬我把代碼修改成了這樣 我發(fā)現(xiàn)客戶同雖然每次都new 了 但是并沒有影響到之前的鏈接,我開了ws服務(wù)根http服務(wù),在http沒請(qǐng)求一次就new AsyncTcpConnection,模擬了下我的需求,貌似這么寫沒啥問題,服務(wù)端能收到消息,動(dòng)態(tài)新增的客戶端也能收到消息。

  • 小W 2023-09-06

    uid應(yīng)該是http請(qǐng)求攜帶的用戶信息,不然可能創(chuàng)建無數(shù)個(gè)客戶端

  • 小W 2023-09-06

    Event-Loop使用Event擴(kuò)展

  • 864328615 2023-09-06

    不用那個(gè)擴(kuò)展,沒多少用戶有100個(gè)就很厲害了,一個(gè)用戶就是一個(gè)門店

年代過于久遠(yuǎn),無法發(fā)表回答
??