laravels实现WebSocket,IM通讯
1.安装laravels
composer require hhxsv5/laravel-s PHP artisan laravels publish
"config": { "platform": { "ext-pcntl": "7.3", "ext-posix": "7.3" } }
3.上代码
<?PHP /** * Created by PHPStorm. * User: Administrator * Date: 2021/9/27 * Time: 17:41 */ namespace App\Service; use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface; use Illuminate\Support\Facades\Log; use Swoole\Http\Request; use Swoole\WebSocket\Frame; use Swoole\WebSocket\Server; class WebSocketService implements WebSocketHandlerInterface { //https://github.com/wenzhizhong/chatce 别人的聊天系统 public function __construct() { } public function onopen(Server $server, Request $request) { // 在触发onopen事件之前,建立WebSocket的HTTP请求已经经过了Laravel的路由, // 所以Laravel的Request、Auth等信息是可读的,Session是可读写的,但仅限在onopen事件中。 // \Log::info('New WebSocket connection', [$request->fd, request()->all(), session()->getId(), session('xxx'), session(['yyy' => time()])]); Log::info('WebSocket 连接建立'.$request->fd); Log::info('WebSocket 连接建立'); $server->push($request->fd, 'Welcome to LaravelS'); // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理 } public function onMessage(Server $server, Frame $frame) { // \Log::info('Received message', [$fram // \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]); // // $server->push($frame->fd, $frame->data);e->fd, $frame->finish]); //发给一个人 //$server->push($frame->fd, $frame->data); //发给所有用户 $list = $server->getClientList(); Log::info('WebSocket 连接建立消息list'.json_encode($list)); foreach ($list as $row){ //$server->close($row); Log::info('fd'.$row); Log::info('fff'.$frame->fd); @$server->push($row, $frame->data); } Log::info('WebSocket 连接建立消息FD'.$frame->fd); Log::info('WebSocket 连接建立消息Data'.$frame->data); // $arr = [ // 'time' => date('Y-m-d H:i:s') // ]; // $server->push($frame->fd, json_encode($arr)); // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理 } public function onClose(Server $server, $fd, $reactorId) { Log::info('WebSocket 连接关闭--'.$fd); Log::info('WebSocket 连接关闭'); // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理 } }
4.html端
<!DOCTYPE html> <html> <head> <Meta charset="UTF-8"> <title>Chat Client</title> </head> <body> <div style="width:600px;margin:0 auto;border:1px solid #ccc;"> <div id="content" style="overflow-y:auto;height:300px;"></div> <hr /> <div style="height:40px;background:white;"> <input type="text" class="form-control" id="message" placeholder="请输入内容"> <button type="button" class="btn btn-primary" onclick="sendMessage()">Primary</button> </div> </div> <script type="text/javascript"> // 端口和ip地址对应不要写错 //var webSocket = new WebSocket("ws://172.16.0.100:5201"); var webSocket = new WebSocket("ws://172.16.0.100/dctrl/ws"); webSocket.onopen = function (event) { console.log('webSocket 连接成功'); }; // 连接关闭时触发 webSocket.onclose = function (event) { console.log("WebSocket 关闭连接"); } //收到服务端消息回调 webSocket.onmessage = function (event) { var content = document.getElementById('content'); content.innerHTML = content.innerHTML.concat('<p style="margin-left:20px;height:20px;line-height:20px;">'+event.data+'</p>'); console.log(event.data) } var sendMessage = function(){ var data = document.getElementById('message').value; webSocket.send(data); } </script> </body> </html>
5.Nginx配置我这用到的是docker容器
upstream swoole { #172.200.7.200:5200 PHP容器的laravels server 172.200.7.200:5200 weight=5 max_fails=3 fail_timeout=30s; keepalive 16; } map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; listen [::]:80; server_name localhost; root /docker/www/lrms-2008/public; index index.PHP index.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /docker/www/lrms-2008/public; } location / { try_files $uri @laravels; } #用地址代理wss的ip和端口 location /dctrl/ws { proxy_pass http://172.16.0.100:5201; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Origin ""; } location @laravels { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header Server-Protocol $server_protocol; proxy_set_header Server-Name $server_name; proxy_set_header Server-Addr $server_addr; proxy_set_header Server-Port $server_port; proxy_pass http://swoole; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。