Easy-Swoole 小内容分块编码传输导致的长时间下载

Author Avatar
黎明余光 7月30日
  • 在其它设备中阅读本文章

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) 重新创建响应对象

参考 https://wiki.swoole.com/wiki/page/925.html

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 协议进行许可,阅读 相关说明

    移动攻城狮鹏鹏
    移动攻城狮鹏鹏  2018-10-20, 12:15

    给大佬儿递茶

    秋枫酱
    秋枫酱  2018-09-04, 21:22

    swoole看的头痛的萌新路过