【问题标题】:delay between server and client when download a file with lighttpd+php使用 lighttpd+php 下载文件时服务器和客户端之间的延迟
【发布时间】:2016-02-24 09:17:19
【问题描述】:

我编写了一个 php 脚本,它将一个大文件(1GB 以上)发送到 http 客户端。
当服务器端写一个“文件传输完成”的日志(lighttpd accesslog和我自己的php日志)发送完成时,客户端仍在进行下载。
在发送最后一段之后,我调用了 ob_flush() 和 flush()。
但是服务器和客户端之间的运行时间差大约是几十秒。
我的测试环境信息是:
- 服务器和客户端连接到同一个本地千兆交换机
- 红帽 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

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

【问题讨论】:

    标签: php file delay lighttpd transfer


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2010-10-20
      • 2017-02-19
      • 1970-01-01
      相关资源
      最近更新 更多