laravel使用websocket即时聊天,主动推送消息

19 篇文章 1 订阅
6 篇文章 1 订阅

ps:准备条件

lnmp/lamp环境已搭建完成并且能正常访问
swoole扩展已安装成功
创建好一个laravel的项目

1、创建swoole.php文件

#在app/Console/Commands增加一个Swoole.php的文件
php artisan make:command Swoole

2、在Kernel.php里增加命令列表

Commands\Swoole::Class

在这里插入图片描述
3、编辑swoole文件

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

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

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

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

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

    public function start()
    {
        //创建websocket服务器对象,监听0.0.0.0:9501端口
        $this->ws = new \swoole_websocket_server("0.0.0.0", 9501);

        //开启ssl模式
//        $this->ws = new \swoole_websocket_server("0.0.0.0", 9501,SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);

        //配置ssl模式
//        $this->ws->set([
//            'ssl_key_file' => '/var/www/html/ssl/4033464_cxh520.top.key',
//            'ssl_cert_file' => '/var/www/html/ssl/4033464_cxh520.top.pem'
//        ]);

        //监听WebSocket连接打开事件
        $this->ws->on('open',[$this,'open']);

        //监听WebSocket消息事件
        $this->ws->on('message',[$this,'message']);

        //监听WebSocket主动推送消息事件
        $this->ws->on('request',[$this,'request']);

        //监听WebSocket连接关闭事件
        $this->ws->on('close',[$this,'close']);

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

    /**
     * 建立连接
     * @param $ws
     * @param $request
     */
    public function open($ws, $request){
        var_dump($request->fd . "连接成功");
    }

    /**
     * 接收消息
     * @param $ws
     * @param $frame
     */
    public function message($ws,$frame){
        var_dump('发送成功');
    }

    /**
     * 接收请求
     * @param $request
     * @param $response
     */
    public function request($request,$response){

    }

    /**
     * 关闭连接
     * @param $ws
     * @param $fd
     */
    public function close($ws,$fd){

    }
}

4、前端代码

const ws = new WebSocket('ws://服务器ip:9501');
ws.onopen = () =>{
	console.log("连接成功");
          ws.send('111');
}

ws.onmessage = ({data}) =>{
	
}

ws.onclose = () =>{

}

5、主动推送代码(放在任何控制器位置调用即可)

public function swooleCurl($data)
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "http://服务器ip:9501");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HEADER, 1);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    curl_exec($curl);
    curl_close($curl);
}

6、服务器项目根目录运行swoole,下面两条命令都可以

#启动
php artisan swoole start
#启动并守护
php artisan swoole &

在这里插入图片描述
在这里插入图片描述
ps:基本逻辑就这样了,后面的具体逻辑就要看每个人业务需求了,好了,到此结束!

  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值