swoole通过websocket进行消息推送

laravel 之 swoole

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use phpDocumentor\Reflection\Types\Null_;

class Swoole extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'swoole:action {action}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'swoole command';

    /**
     * @var Message
     */
    protected $message;

    /**
     * @var User
     */
    protected $user;

    /**
     * @var Room
     */
    protected $room;

    private $server;
    private $fid=[];

    /**
     * Swoole constructor.
     * @param Message $message
     * @param User $user
     * @param RoomJoin $room
     */
    public function __construct( )
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $action = $this->argument('action');
        switch ($action) {
            case 'start':
                $this->start();
                break;
            case 'stop':
                $this->stop();
                break;
            case 'restart':
                $this->restart();
                break;
        }
    }

    /**
     * 开启websocket
     */
    private function start()
    {
        $this->server = new \swoole_websocket_server(config("swoole.host"), config("swoole.port"), SWOOLE_BASE, SWOOLE_SOCK_TCP);
        //SWOOLE_SSL  需要ssl才加
        #监听WebSocket连接打开事件
        $this->server->on('open', function ($server, $request) {
            // 验证链接
            $fdinfo = $this->server->getClientInfo($request->fd);
            if($fdinfo['remote_ip'] != '127.0.0.1' && $fdinfo['server_port'] != '9502')
                return;
            $this->server->push($request->fd, '["pang"]');
            // 验证链接
            $fdinfo = $this->server->getClientInfo($request->fd);
            if($fdinfo['remote_ip'] != '127.0.0.1' && $fdinfo['server_port'] != '9502')
                return;
            $this->fid[]=$request->fd;   # $request->fd fd
        });
        #监听WebSocket消息事件
        $this->server->on('message', function ($server, $frame) {   #$frame->data 消息内容
            $msg = 'from' . $frame->fd . ":{$frame->data}\n";
            \Log::info("message :".$msg);
//            if($frame->data != 'pings') return;
            // 验证链接
            $fdinfo = $this->server->getClientInfo($frame->fd);
            if($fdinfo['remote_ip'] != '127.0.0.1' && $fdinfo['server_port'] != '9502')
                return;
            foreach ($this->fid as $fd) {
                $server->push($fd, $msg);
            }
            \Log::info("fds :".json_encode($this->fid));
        });

        //监听WebSocket连接关闭事件
        $this->server->on('close', function($ws, $fd) {
            // 验证链接
            $fdinfo = $this->server->getClientInfo($fd);
            if($fdinfo['remote_ip'] != '127.0.0.1' && $fdinfo['server_port'] != '9502')
                return;
            \Log::info("client info:".json_encode($fdinfo));
            \Log::info("list fd:".json_encode($this->fid));
            $fd_key = array_search($fd, $this->fid ? $this->fid : []);
            $key_zero = isset($this->fid[0]) && $this->fid[0] == $fd ? TRUE : FALSE;  # key=0
            if ($fd_key || $key_zero) {
                unset($this->fid[$fd_key]);
            }
            \Log::info("client-{$fd} is closed\n");
        });

        #onRequest回调    http://127.0.0.1:9502/?sendto=1,20,3&message=%E4%BD%A0%E5%A5%BD
        $this->server->on('request', function ($req, $respone) {
            // 验证链接
            $fdinfo = $this->server->getClientInfo($respone->fd);
            if($fdinfo['remote_ip'] != '127.0.0.1' && $fdinfo['server_port'] != '9502')
                $respone->end("404 not found");
            # get 两个参数, userid ","  发送消息
            $list=[];
            if (isset($req->get['message'])) {
                $list = $this->fid;
                if (!empty($list)) {
                    foreach ($list as $fd) {
                        $this->server->push($fd, $req->get['message']);
                    }
                }
            }

            $total= count($this->fid);
            $sendSum= count($list);
            $respone->end("Current fid:{$respone->fd},  OnLine:{$total}, Send:{$sendSum}");

        });

        $this->server->start();
    }

    /**
     * 停止websocket
     */
    private function stop()
    {

    }

    /**
     * 重启
     */
    private function restart()
    {

    }


}

猜你喜欢

转载自www.cnblogs.com/akidongzi/p/10419889.html
今日推荐