PHPはWebsocketサーバを構築するためにワーカーマンを使用してWebsocket登録を実現します.

4378 ワード

laravelを使用しているので、アーティストを使ってサービスを作成したり、他のファイルを使って作成したり、直接phpコマンドで実行したり、ブログPHPを参照してワーカーマンを使ってバックエンドメッセージをプッシュしてフロントエンドを実現したり、WeChat登録を完了したら、先にこちらのブログを読んでください.読者に全体のプッシュプロセスを理解するのに役立ちます.
  • コードは以下の通りです.
    argument('action');
            $argv[1] = $argv[2];
            $argv[2] = isset($argv[3]) ? "-{$argv[3]}" : '';
            switch ($arg) {
                case 'start':
                    $this->start();
                    break;
                case 'stop':
                    break;
                case 'restart':
                    break;
                case 'reload':
                    break;
                case 'status':
                    break;
                case 'connections':
                    break;
            }
    
        }
    
        private function start(){
            //   websocket  ,     ,        websocket  
            $this->worker = new Worker('websocket://0.0.0.0:18888');
            //        
            $this->worker->uidConnections = [];
            $this->worker->count = 1;
            $this->worker->onWorkerStart = function ($worker) {
                //       ,        , php        
                $inner_text_worker = new Worker('tcp://0.0.0.0:18889');
                $inner_text_worker->onMessage = function ($connection, $buffer) {
                    Log::alert('workerman inner accept message : ' . $buffer);
                    $data = json_decode($buffer, true);
                    $uid = $data['scene'];
                    $token = $data['token'];
                    //           
                    $res = $this->sendMessageByUid($uid, $token);
                    Log::alert('workerman reply message to uid : '. $uid .'..$openid..'. $token);
                    $mess = $res ? 'ok' : 'fail';
                    Log::alert('workerman reply message : ' . $mess);
                    //   php       
                    $connection->send($mess);
                };
                $inner_text_worker->listen();
            };
    
            $this->worker->onMessage = function ($connection, $data) {
                Log::alert('workerman accept browser data : ' . $data);
                if (!isset($connection->uid)) {
                    $connection->uid = $data;
                    $this->worker->uidConnections[$connection->uid] = $connection;
                    return;
                }
            };
    
            $this->worker->onClose = function ($connection) {
                if (isset($connection->uid)) {
                    Log::alert('workerman close browser : ' . $connection->uid);
                    unset($this->worker->uidConnections[$connection->uid]);
                }
            };
    
            Worker::runAll();
        }
    
        /**
         *     
         * @param $message
         */
        private function broadCast($message)
        {
            global $worker;
            foreach ($worker->uidConnections as $connection) {
                $connection->send($message);
            }
        }
    
        private function sendMessageByUid($uid, $message)
        {
            Log::alert(json_encode($this->worker->uidConnections));
            if (isset($this->worker->uidConnections[$uid])) {
                $connection = $this->worker->uidConnections[$uid];
                $connection->send($message);
                return true;
            }
            return false;
        }
    }
    
    
    アプリ/Consolie/Kernel.phpに登録する
    protected $commands = [
            //
            WebsocketServer::class,
        ];
    
  • プロジェクトのルートディレクトリに入って、起動して、接続php arsian websocket start
  • を待ちます.