Easy-Swoole 小内容分块编码传输导致的长时间下载
Swoole 可以说是一个极佳的 PHP 常驻内存解决方案,并且自带的 http server 还有一个坑(
0x00
Swoole 在不知道哪个版本就支持了 chunk,分块编码传输,具体实现是每次调用 $response->write()
传输一个 chunk
然而如果数据量过少,比如 (string) "test"
,就会发现传输时 Downloading
的过程耗时长达 40ms+
https://blog.xtlsoft.top/2018/07/30/swoole-in-transfer-encoding-chunked.html
0x01 解决方案
隔壁已经找到解决方案了,就是直接通过 $response->end()
来一次性发送内容,而不是分块传输
然而 easy-swoole
这框架压根就没打算让你这么干,它提供的 $response->end()
实现了四个状态,分别是 未结束
逻辑结束
真正结束
分离响应
,而你根本没有任何方式做到 真正结束
虽然你可以得到原生 swoole 响应对象,但是如果你通过原生方式结束响应还能收获它的 reponse()
函数带来的两条报错(
唯一一个可行的方式就是通过 swoole 原生的、它也实现了的 $response->detach()
来分离响应,之后通过 \Swoole\Http\Response::create($fd)
重新创建响应对象
0x02 具体实现
$fd = $this->response()->detach();
$resp = \Swoole\Http\Response::create($fd);
$resp->end($content);
本文链接:https://blog.lim-light.com/archives/easy-swoole-in-transfer-encoding-chunked.html
本文采用 CC BY-NC-SA 3.0 CN 协议进行许可,阅读 相关说明
给大佬儿递茶
swoole看的头痛的萌新路过