代码之家  ›  专栏  ›  技术社区  ›  darron

Apache2和CGI—如何防止Apache缓冲POST数据?

  •  5
  • darron  · 技术社区  · 14 年前

    然而,Apache2似乎希望在发送CGI应用程序之前等待全文完成。

    编辑

    看起来它实际上是被缓冲的CGI的输出。我开始把数据流到一个临时文件来观察它的进程。我还有一个问题。

    1) 正在缓冲输出。我试过setenif(简单地说就是SetEnv)来表示“!nogzip“,”nogzip“,和“!gzip”,但没有成功(在CGI目录定义中)。

    2) 在CGI进程退出之前,Apache2似乎不会读取CGI的输出?我注意到我的CGI应用程序(flushing或not)在80K左右的“fwrite(…,stdout)”线上永久挂起。

    好吧,火狐在耍我。如果我发送一个150K文件,那么在80K左右就没有CGI锁定。如果文件是2G,那么就会被锁定。所以,Firefox在试图发送文件时没有读取服务器的输出。。。是否有任何标题或替代内容类型来更改该行为?

    编辑

    最后一个音符

    就像一张纸条。。。我认为Apache2是缓冲输入的原因是我总是得到一个“Content-Length”环境变量。我猜FireFox足够聪明,可以预先计算多部分表单上传的内容长度,Apache2正在传递这个信息。我以为Apache2在缓冲输入并报告长度本身。

    3 回复  |  直到 14 年前
        1
  •  3
  •   bobince    14 年前

    你确定问题出在缓冲的输入上吗?如果您的调试方法类似于 print 对回应的回应。

    stdout 在脚本中或通过过滤器。通常的罪魁祸首是 DEFLATE 过滤器,通常用于压缩所有 text/ 响应,无论是来自静态文件还是脚本。一般来说,压缩脚本的输出是个好主意,但它的副作用是它会导致响应被完全缓冲。如果需要立即响应,则需要通过限制 AddOutputFilterByType 特别 <Directory> s、 或使用 mod_setenvif 设置 !nogzip 注意。)

    放气 )可能会导致CGI输入被缓冲,如果您正在使用任何。但它们的应用却不那么广泛。

    编辑:现在,只需注释掉所有启用deflate过滤器的httpd配置。你可以有选择地把它放回去,一旦你高兴你的IO是无缓冲没有它。

    我注意到我的CGI应用程序(flushing或not)在80K左右的“fwrite(…,stdout)”线上永久挂起。

    你在这里干什么?一般来说,编写进度信息输出以响应直接表单POST是没有意义的,因为浏览器通常不会显示它。如果你想在一个普通的HTML表单提交上提供上传进度反馈,这通常是通过一些黑客来完成的,比如让AJAX连接检查查看上传的进展(意味着必须共享进度信息,例如在数据库中),或者使用Flash上传组件。

        2
  •  0
  •   Mike Tunnicliffe    14 年前

    从Apache HTTP服务器手册的(旧版本)中:

    每次脚本执行“刷新” 向客户报告。一些脚本 语言,例如Perl,具有 他们自己的输出缓冲-这 可以通过设置$| 特殊变量为1。当然是这个 正在传输的数据包 结果给人一种迟钝的感觉 最终用户。

    您是否尝试过刷新标准输出或检查您使用的语言是否有可以禁用的缓冲区?

        3
  •  0
  •   user1111567 user1111567    13 年前

    以下是在服务器端使用perl时控制缓冲的有用指南:

    http://perl.plover.com/FAQs/Buffering.html

    许多想法和概念也适用于其他语言,例如使用缓冲和非缓冲输出、读取和写入数据的原始系统调用与自己进行缓冲的I/O库。