使用 lighttpd+php 下载文件时服务器和客户端之间的延迟


delay between server and client when download a file with lighttpd+php

我写了一个php脚本,它向http客户端
发送一个大文件(1GB以上)。当服务器端写一个日志"文件传输完成"(lighttpd 访问日志和我自己的 php 日志)完成发送时,客户端仍在进行下载。
我在发送
最后一个段后调用了 ob_flush() 和 flush()。但是服务器和客户端之间的运行时间差大约是几十秒。
我的测试环境信息是:
- 服务器和客户端与同一本地千兆交换机
连接 - Redhat 6.4, Lighttpd 1.4.28, PHP 5.3.3
- 服务器端的 sysctl 参数为:
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 16384 4194304
- PHP.ini缓冲区大小为:
memory_limit = 16M

如何减少服务器和客户端之间的完成时间差距?

lighttpd 尽可能快地读取 CGI 的输出,以便 CGI 可以完成处理并释放资源。 许多并行运行的 CGI 脚本实例通常比单个 lighttpd 进程使用更多的内存。

lighttpd 中的默认行为是在发送到客户端之前缓冲整个响应,对于本地生产者和远程客户端,本地生产可能比网络快得多。 对于 LAN,情况可能正好相反,尤其是当生产者(后端 CGI)速度较慢时。

在 lighttpd 1.4.40 及更高版本中,您可以在 lighttpd.conf 中设置server.stream-response-body = 1,lighttpd 将尝试将响应流式传输到客户端,因为它从后端 CGI 收到响应。 如果后端发送响应的速度快于 Lighttpd 发送到网络的速度,LightTPD 1.4.40+ 仍将缓冲到磁盘。 如果您希望 lighttpd 1.4.40+ 执行最小缓冲(如果客户端或网络比生产者慢,则可能会阻止后端生产者),则可以设置server.stream-response-body = 2