环境说明:
php7.4.22
swoole4.6.1
think-swoole v4.0.4
安装步骤网上都有这边就不说了
swoole.php 配置
<?php use think\swoole\websocket\socketio\Handler; return [ 'http' => [ 'enable' => true, 'host' => '0.0.0.0', 'port' => 7001, 'worker_num' => swoole_cpu_num(), 'options' => [] ], 'websocket' => [ 'enable' => true, 'handler' => Handler::class, 'ping_interval' => 25000, 'ping_timeout' => 60000, 'room' => [ 'type' => 'table', 'table' => [ 'room_rows' => 4096, 'room_size' => 2048, 'client_rows' => 8192, 'client_size' => 2048, ], 'redis' => [ 'host' => '127.0.0.1', 'port' => 6379, 'max_active' => 3, 'max_wait_time' => 5, ], ], 'listen' => [ 'event' => \app\listener\WebsocketEvent::class, //重要的事件监听类 ], 'subscribe' => [], ], 'rpc' => [ 'server' => [ 'enable' => false, 'host' => '0.0.0.0', 'port' => 9000, 'worker_num' => swoole_cpu_num(), 'services' => [], ], 'client' => [], ], //队列 'queue' => [ 'enable' => false, 'workers' => [], ], 'hot_update' => [ // 'enable' => env('APP_DEBUG', false), 'enable' => true, 'name' => ['*.php'], 'include' => [app_path()], 'exclude' => [], ], //连接池 'pool' => [ 'db' => [ 'enable' => true, 'max_active' => 3, 'max_wait_time' => 5, ], 'cache' => [ 'enable' => true, 'max_active' => 3, 'max_wait_time' => 5, ], //自定义连接池 ], 'tables' => [], //每个worker里需要预加载以共用的实例 'concretes' => [], //重置器 'resetters' => [], //每次请求前需要清空的实例 'instances' => [], //每次请求前需要重新执行的服务 'services' => [], ];
事件WebsocketEvent.php
<?php declare (strict_types = 1); namespace app\listener; use think\Container; use think\swoole\Websocket; class WebsocketEvent { public $websocket = null; public function __construct(Container $container) { $this->websocket = $container->make(Websocket::class); } /** * 事件监听处理 * @param $event */ public function handle($event) { $func = $event->type; $this->$func($event); } /** * 测试类型 * @param $event */ public function test($event) { $this->websocket->emit('testcallback', ['aaaaa' => 1, 'getdata' => '123123']); } /** * 加入房间 * @param $event */ public function join($event) { $data = $event->data; $this->websocket->join($data[0]['room']); } /** * 离开房间 * @param $event */ public function leave($event) { $data = $event->data; $this->websocket->leave($data[0]['room']); } public function __call($name,$arguments) { $this->websocket->emit('testcallback', ['msg' => '不存在的请求类型:'.$name]); } }
demo.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.socket.io/socket.io-1.4.4.js"></script> <script src="https://code.jquery.com/jquery-1.11.1.js"></script> </head> <body> <div> <div> 返回内容: </div> <div style="width: 600px;height: 600px" id="content"> </div> </div> <div> 在控制台中执行 socket.emit("test",{"asd":"我是内容"}) </div> <div> 在控制台中执行 socket.emit("join",{"room":"roomtest"}) 加入房间 </div> <div> 在控制台中执行 socket.emit("leave",{"room":["roomtest"]}) 离开房间 </div> <script> var socket = io('http://192.168.0.187:7001',{transports: ['websocket']}); //xxx.com 这个自己替换成自己的环境thinkphp-swoole 的端口或者是nginx的代理端口 //transports: ['websocket'] 一定要这个,改为websocket链接 //polling 这个不支持,轮询会导致请求变成http请求,post请求全部拒接掉 // socket.emit('test',{"asd":"asd"}); // //自定义msg事件,发送‘你好服务器’字符串向服务器 socket.on('testcallback',(data)=>{ //监听浏览器通过msg事件发送的信息 console.log('data',data);//你好浏览器 }); // socket.emit('join',{"asd":"asd"}); // socket.on('roomJoin',(data)=>{ // console.log(data);//你好浏览器 // }) </script> </body> </html>
nginx配置
server { listen 80; server_name webrtcswoole.com; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/strange-chat-room/public; #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; #SSL-END #ERROR-PAGE-START 错误页配置,可以注释、删除或修改 #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END #PHP-INFO-START PHP引用配置,可以注释或修改 include enable-php-74.conf; #PHP-INFO-END #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 include /www/server/panel/vhost/rewrite/webrtcswoole.com.conf; #REWRITE-END location /socket.io/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; proxy_pass http://0.0.0.0:7001/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } #禁止访问的文件或目录 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) { return 404; } #一键申请SSL证书验证目录相关设置 location ~ \.well-known{ allow all; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; error_log /dev/null; access_log /dev/null; } location ~ .*\.(js|css)?$ { expires 12h; error_log /dev/null; access_log /dev/null; } access_log /www/wwwlogs/webrtcswoole.com.log; error_log /www/wwwlogs/webrtcswoole.com.error.log; }