框架是用的tp5.1
使用composer 安装 composer require workerman/phpsocket.io 扩展
然后public入口出新建socket.php
具体代码如下:
<?php // [ 应用入口文件 ] namespace think; // 加载基础文件 require __DIR__ . '/../thinkphp/base.php'; // 执行应用并响应(绑定) Container::get('app')->bind('socket/Server/index')->run()->send();//这段代码意思就是绑定模块socket以及对应的控制器和方法。
然后就是新建模块
application/socket目录
新建控制器Server.php 代码
<?php namespace appsocketcontroller; use PHPSocketIOSocketIO; use PredisClient; use WorkermanWorker; class Server { private $redis; public function __construct() { $config = config('redis.'); $this->redis = new Client($config); } public function index(){ header("Access-Control-Allow-Origin: *"); $io = new SocketIO(5881); $io->on('workerStart', function()use($io) { $worker = new Worker('http://0.0.0.0:5880'); $worker->onMessage = function($connection, $request)use ($io) { $data = $request->post('msg'); if ($data){ $io->emit('new_msg',$data); $connection->send('ok'); } $connection->send('fail'); }; $worker->listen(); }); $io->on('connection', function ($socket) use ($io) {}); Worker::runAll(); } }
Worker的开启:监听一个http端口,通过http协议访问这个端口可以向所有客户端推送数据(http://ip:5880?msg=xxxx)
前端代码
<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script> <script> layui.use(['layer','notice'], function(){ var notice = layui.notice; notice.options = { closeButton:true,//显示关闭按钮 positionClass:"toast-top-center",//弹出的位置, showDuration:"500",//显示的时间 hideDuration:"1000",//消失的时间 timeOut:"5000",//停留的时间 extendedTimeOut:"1000",//控制时间 showEasing:"swing",//显示时的动画缓冲方式 hideEasing:"linear",//消失时的动画缓冲方式 iconClass: 'toast-info', // 自定义图标,有内置,如不需要则传空 支持layui内置图标/自定义iconfont类名 onclick: null, // 点击关闭回调 }; var socket = io('http://服务器IP:5881'); // 后端推送来消息时 socket.on('new_msg', function (msg) { notice.error(msg); }); }); </script>
上面使用了一个layui的消息提醒插件,消息效果
然后就是通过curl访问地址:http://ip:5880 传递参数['msg'=>'你有新的账户异常,请注意'] 即可