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

标签 apache forms post apache2 cgi

我正在尝试在 CGI 中提供文件上传的实时解析,并在上传数据时在屏幕上显示数据。

但是,Apache2 似乎想要等待完整的 POST 完成,然后再向 CGI 应用程序发送任何内容。

如何强制 Apache2 停止将 POST 缓冲到我的 CGI 应用程序?

编辑

看起来它实际上是被缓冲的 CGI 的输出。我开始将数据流式传输到临时文件以观察其进度。那,我还有另一个问题。

1) 输出正在缓冲。我已经为 "!nogzip"、"nogzip"和 "!gzip"尝试了 SetEnvIf(和简单的 SetEnv),但没有成功(在 CGI 目录定义中)。

2) Apache2 似乎在 CGI 进程退出之前不会读取 CGI 的输出?我注意到我的 CGI 应用程序(是否刷新)在大约 80K 的“fwrite(..., stdout)”行上永久挂断。

编辑

好吧,Firefox 惹恼了我。如果我发送一个 150K 的文件,那么大约 80K 就没有 CGI 锁定。如果文件是 2G,则存在锁定。因此,Firefox 在尝试发送文件时没有读取服务器的输出......是否有任何标题或替代内容类型可以更改该行为?

编辑

好吧,我想大文件上的 CGI 输出锁定实际上并不重要。我不需要回显文件!我正在调试由调试辅助工具引起的问题。 :)

我想这足够了。谢谢!

最后说明

只是作为说明......我认为Apache2缓冲输入的原因是我总是有一个“内容长度”环境变量。我猜 FireFox 足够聪明,可以预先计算多部分表单上传的内容长度,而 Apache2 正在传递它。我认为 Apache2 正在缓冲输入并报告长度本身。

最佳答案

你确定这是输入被缓冲的问题吗?输出缓冲问题更为常见,如果您的调试方法类似于 print,则可能无法将其与输入缓冲区分开来。回应。

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

同样,输入过滤器(再次包括 DEFLATE )可能会导致 CGI 输入被缓冲,如果您正在使用任何输入过滤器。但它们的使用不那么广泛。

编辑:现在,只需注释掉您启用 deflate 过滤器的任何 httpd conf。一旦您对 IO 在没有它的情况下无缓冲感到满意,您就可以有选择地将其放回原处。

I notice that my CGI app (flushing or not) is hanging up permanently on a "fwrite(..., stdout)" line at around 80K.



是的...如果您还没有阅读所有输入,则在尝试写入输出时可能会死锁,如果您写太多。您可以阻塞输出调用,等待网络缓冲区疏通,以便您可以发送您获得的新数据,但它们永远不会发送,因为浏览器会在开始读取输出之前尝试发送所有数据。

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

关于Apache2 和 CGI​​ - 如何防止 Apache 缓冲 POST 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196861/

相关文章:

javascript - 如何在 cordova 应用程序中使用带有 javascript 适配器的 POST?

php - 调用 REST api (Phalcon) 时出现 404 错误

连接到我的本地 XAMPP 托管网站时 SSL 库中的 Android 失败

python - 无法在我的 VPS 上运行 CGI 程序

php - 如何合并 2 个数组(PHP、表单)

php - 如何使用 PHP 获取隐藏字段的值

python - 为了提交 HTML 表单数据,我应该使用变量 "id"或 "name"

python - 如何在 Python 中接收 Github Webhooks

javascript - WebSocket 握手期间出错 : 'Upgrade' header is missing (Apache 2. 4 + mod_proxy_wstunnel)

wcf - 通过 3G 向 WCF 服务发送 POST 请求