Closed
Description
谷歌应用市场机器审核 安卓客户端发起ws长连接 不兼容 被识别成http请求
后来排查 与其他客户端区别是 少传了个 Upgrade: websocket
这种特殊问题下 至于swoole调不调整 这看你们权衡了
这边通过nginx 遇到 sec_websocket_key 增加 Upgrade: websocket 解决
map $http_sec_websocket_key $req_upgrade {
default $http_upgrade;
~.+ "websocket";
}
server {
location / {
.....
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $req_upgrade;# map 判断 Sec-WebSocket-Key 是否存在 修复少部分机型兼容问题
}
}
#############################
swoole 5.1.3
打印请求信息
var_dump($request->header)
{
"host": "ws.aaa.net",
"x-real_ip": "18.68....",
"x-forwarded-for": "66.249....",
"connection": "upgrade",
"accept-encoding": "gzip",
"sec-websocket-extensions": "permessage-deflate",
"sec-websocket-key": "cH8Hwg28....WElHL3Lw==",
"permessage-deflate": "true",
"user-agent": "okhttp/4.12.0",
"via": "1.1 d6022fd.....cc.cloudfront.net (CloudFront)",
"x-amz-cf-id": "5VrnwteDJZ-S.Die...Ydw==",
"sec-websocket-version": "13"
}
$server = new \Swoole\WebSocket\Server('0.0.0.0', 80,SWOOLE_PROCESS);
$server->set([
'daemonize' =>true,#守护进程
'log_file' => WORK_LOG,
'reactor_num' => swoole_cpu_num(),#reactor线程数 1-4倍 默认值:CPU 核数
'worker_num' => swoole_cpu_num(),#CPU核数的1-4倍 默认值:CPU 核数 迎接Swoole 6多线程版本
'task_worker_num' =>0 ,#WORK_NUM,#task进程数量
'open_tcp_keepalive' => true,
'tcp_keepidle' => 12, //n秒没有数据传输就进行检测
'tcp_keepinterval' => 10, //n秒探测一次
'tcp_keepcount' => 2, //探测的次数,超过n次后还没回包close此连接
// 'open_tcp_nodelay' => false,#true关闭Nagle算法 false开启Nagle算法
'hook_flags' => SWOOLE_HOOK_ALL,#开启协程钩子
'enable_coroutine' => true,#启用协程
'task_enable_coroutine' => true,#Task启用协程
'reload_async' => true,#触发重启 当前无任何协程时进程才会退出
'max_wait_time' => 3,#重启等待超时 强杀进程
'open_websocket_ping_frame' => true,#ws开启ping帧
'open_websocket_pong_frame' => true,#ws开启pong帧
'websocket_compression' => true,#ws压缩
'http_parse_cookie' => false,#自动解析COOKIE请求
'http_parse_post' => true,#自动解析POST请求
'http_parse_files' => false,#自动解析上传文件
'http_compression' => true,#http压缩
'http_compression_level'=> 6,#压缩级别 1-9
'open_http_protocol' => true,#HTTP协议解析
]);
#ws数据接收事件回调函数
$server->on('message',function ($server, $frame){
$_fd = $frame->fd;
var_dump(func_get_args());
});
#http请求事件回调函数
$server->on('request', function ($request, $response){
global $server;
var_dump(func_get_args());
@$response->end("返回结果".$ret);
});
$server->start();