laravel下安装laravels以及websocket的使用
LaravelS 是 Swoole 和 Laravel/Lumen 之间开箱即用的适配器。
>= 5.5.9
推荐PHP7+
Swoole>= 1.7.19
从2.0.12开始不再支持PHP5
推荐4.2.3+
Laravel/Lumen>= 5.1
推荐5.6+
1.通过Compor安装(packagist)。有可能找不到3.0
版本,解决方案移步#81。
compor require "hhxsv5/laravel-s:~3.7.0" -vvv# 确保你的compor.lock文件是在版本控制中
2.注册Service Provider(以下两步二选一)。
Laravel
: 修改文件config/app.php
,Laravel 5.5+支持包自动发现,你应该跳过这步
'providers' => [ //... Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,],
Lumen
: 修改文件bootstrap/app.php
$app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);
3.发布配置和二进制文件。
每次升级LaravelS后,需重新publish;点击Relea去了解各个版本的变更记录。
php artisan laravels publish# 配置文件:config/laravels.php# 二进制文件:bin/laravels bin/fswatch bin/inotify
4.修改配置config/laravels.php
:监听的IP、端口等,请参考配置项。
操作命令:
在运行之前,请先仔细阅读:
注意事项(这非常重要)。
php bin/laravels {start|stop|restart|reload|info|help}
。onStop
方法restart重启LaravelS:先平滑Stop
,然后再Start
;在Start
完成之前,服务是不可用的
reload平滑重启所有Task/Worker/Timer进程(这些进程内包含了你的业务代码),并触发自定义进程的onReload
方法,不会重启Master/Manger进程;修改config/laravels.php
后,你只有
调用restart
来完成重启info显示组件的版本信息help显示帮助信息启动选项,针对start
和restart
命令。laravels.php
中swoole.daemonize
设置-e|–env指定运行的环境,如--env=testing
将会优先使用配置文件.env.testing
,这个特性要求Laravel 5.2+
-i|–ignore忽略检查Master进程的PID文件-x|–x-version记录当前工程的版本号(分支),保存在$_ENV
/$_SERVER
中,访问方式:$_ENV['X_VERSION']
$_SERVER['X_VERSION']
$request->rver->get('X_VERSION')
运行时
文件:start
时会自动执行php artisan laravels config
并生成这些文件,开发者一般不需要关注它们,建议将它们加到.gitignore
中。运行时
配置文件storage/laravels.pidMaster进程的PID文件storage/laravels-timer-process.pid定时器Timer进程的PID文件storage/laravels-custom-process.pid所有自定义进程的PID文件gzip on;gzip_min_length 1024;gzip_comp_level 2;gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml;gzip_vary on;gzip_disable "msie6";upstream swoole { # 通过 IP:Port 连接 rver 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s; # 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能 #rver unix:/yourpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s; #rver 192.168.1.1:5200 weight=3 max_fails=3祝福学生 fail_timeout=30s; #rver 192.168.1.2:5200 backup; keepalive 16;}rver { listen 80; # 别忘了绑Host rver_name laravels.com; root /yourpath/laravel-s-test/public; access_log /yourpath/log/nginx/$rver_name.access.log main; autoindex off; index index.html index.htm; # Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。 loc比你高ation / { try_files $uri @laravels; } # 当请求PHP文件时直接响应404,防止暴露public/*.php #location ~* \.php$ { # return 404; #} location @laravels { # proxy_connect_timeout 60s; 壁纸励志 # proxy_nd_timeout 60s; # proxy_read_timeout 120s; proxy_http_version 1.1; proxy_t_header Connection ""; proxy_t_header X-Real-IP $remote_addr; proxy_t_header X-Real-PORT $remote_port; proxy_t_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_t_header Host $http_host; proxy_t_header Scheme $scheme; proxy_t_header Server-Protocol $rver_protocol; proxy_t_header Server-Name $rver_name; proxy_t_header Server-Addr $rver_addr; proxy_t_header Server-Port $rver_port; # “swoole”是指upstream proxy_pass http://swoole; }}
WebSocket服务器监听的IP和端口与Http服务器相同。
1.创建WebSocket Handler类,并实现接口WebSocketHandlerInterface
。start时会自动实例化,不需要手动创建实例。
<?php/** * Created by PhpStorm. * Ur: wxiangqian * Date: 2020-10-28 * Time: 15:23 */namespace App\Services;u Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;u Illuminate\Support\Facades\Log;u Swoole\Http\Request;u Swoole\WebSocket\Frame;u Swoole\WebSocket\Server;/** * @e https://wiki.swoole.com/#/start/start_ws_rver */class WebSocketService implements WebSocketHandlerInterface{ // 声明没有参数的构造函数 public function __construct() { } public function onOpen(Server $rver, Request $request) { // 在触发onOpen事件之前,建立WebSocket的HTTP请求已经经过了Laravel的路由, // 所以Laravel的Request、Auth等信息是可读的,Session是可读写的,但仅限在onOpen事件中。 // \Log::info('New WebSocket connection', [$request->fd, request()->all(), ssion()->getId(), ssion('xxx'), ssion(['yyy' => time()])]); Log::info('WebSocket 连接建立'); $rver->push($request->fd, 'Welcome to LaravelS'); // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理 } public function onMessage(Server $rver, Frame $frame) { // \Log::info('Received message', [$fram // \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]); // // $rver->push($frame->fd, $frame->data);e->fd, $frame->data, $frame->opcode, $frame->finish]); $rver->push($frame->fd, $frame->data);// $arr = [// 'time' => date('Y-m-d H:i:s')// ];// $rver->push($frame->fd, json_encode($arr)); // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理 } public function onClo(Server $rver, $fd, $reactorId) { Log::info('WebSocket 连接关闭'); // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理 }}
2.更改配置config/laravels.php
。
// ...'websocket' => [ 'enable' => true, // 看清楚,这里是true 'handler' => \App\Services\WebSocketService::class,],'swoole' => [ //... // dispatch_mode只能设置为2、4、5,https://wiki.swoole.com/#/rver/tting?id=dispatch_mode 'dispatch_mode' => 2, //...],// ...
3.使用SwooleTable
绑定FD与UrId,可选的,Swoole Table示例。也可以用其他全局存储服务,例如Redis/Memcached/MySQL,但需要注意多个Swoole Server
实例时FD可能冲突。
4.与Nginx配合使用(推荐)
参考 WebSocket代理
map $http_upgrade $connection_upgrade { default upgrade; '' clo;}upstream swoole { # 通过 IP:Port 连接 rver 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s; # 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能 #rver unix:/yourpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s; #rver 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s; #rver 192.168.1.2:5200 backup; keepalive 16;}rver { listen 80; # 别忘了绑Host rver_name laravels.com; root /yourpath/laravel-s-test/public; access_log /yourpath/log/nginx/$rver_name.access.log main; autoindex off; index index.html index.htm; # Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。 location / { try_files $uri @laravels; } # 当请求PHP文件时直接响应404,防止暴露public/*.php #location ~* \.php$ { # return 404; #} # Http和WebSocket共存,Nginx通过location区分 # !!! WebSocket连接时路径为/ws # Javascript: var ws = new WebSocket("ws://laravels.com/ws"); location =/ws { # proxy带虎字的成语_connect_timeout 60s; # proxy_nd_timeout 60s; # proxy_read_timeout:如果60秒内被代理的服务器没有响应数据给Nginx,那么Nginx会关闭当前连接;同时,Swoole的心跳设置也会影响连接的关闭 # proxy_read_timeout 60s; proxy_http_version 1.1; proxy_t_header X-Real-IP $remote_addr; proxy_t_header X-Real-PORT $remote_port; proxy_t_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_t_header Host $http_host; proxy_t_header Scheme $scheme; proxy_t_header Server-Protocol $rver_protocol; proxy_t_header Server-Name $rver_name; proxy_t_header Server-Addr $rver_addr; proxy_t_header Server-Port $rver_port; proxy_t_header Upgrade $http_upgrade; proxy_t_header Connection $connection_upgrade; proxy_pass http://swoole; } location @laravels { # proxy_connect_timeout 60s; # proxy_nd_timeout 60s; # proxy_read_timeout 60s; proxy_http_version 1.1; proxy_t_header Connection ""; proxy_t_header X-Real-IP $remote_addr; proxy_t_header X-Real-PORT $remote_port; proxy_t_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_t_header Host $http_host; proxy_t_header Scheme $scheme; proxy_t_header Server-Protocol $rver_protocol; proxy_t_header Server-Name $rver_name; proxy_t_header Server-Addr $rver_addr; proxy_t_header Server-Port $rver_port; proxy_pass http://swoole; }}
5.心跳配置
Swoole的心跳配置
// config/laravels.php'swoole' => [ //... // 表示每60秒遍历一次,一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭 'heartbeat_idle_time' => 600, 'heartbeat_check_interval' => 60, //...],
Nginx读取代理服务器超时的配置
# 如果60秒内被代理的服务器没有响应数据给Nginx,那么Nginx会关闭当前连接proxy_read_timeout 60s;
GitHub完整源代码
<!DOCTYPE html><html><head> <meta 脾虚吃什么好chart="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="ndMessage()">Primary</button> </div></div><script type="text/javascript"> if(window.WebSocket){ // 端口和ip地址对应不要写错 var webSocket = new WebSocket("ws://127.0.0.1:5200"); webSocket.onopen = function (event) { console.log('webSocket 连接成功'); }; // 连接关闭时触发 webSocket.onclo = 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 ndMessage = function(){ var data = document.getElementById('message').value; webSocket.nd(data); } }el{ console.log("您的浏览器不支持WebSocket"); } </script></body></html>
希望本文可以帮助大家学习如何使用websocket。
本文地址:https://blog.csdn.net/qq175023117/article/details/110532521
本文发布于:2023-04-09 00:43:24,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/8251eb2496fccfe3b3df653c153c6b87.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:荐 laravel下安装laravels以及websocket的使用.doc
本文 PDF 下载地址:荐 laravel下安装laravels以及websocket的使用.pdf
留言与评论(共有 0 条评论) |