如何让Apache停止缓冲POST数据?

时间:2013-09-06 18:57:09

标签: php apache

当通过XHR流上传文件到在Apache网络服务器上运行的PHP脚本时,有些东西正在缓冲整个POST主体,然后在整个文件上传后将其交给PHP。

这是内存密集型而非最佳状态。我有另一个服务器配置大致相同的方式将POST数据直接流式传输到PHP脚本导致内存使用率低。

我无法为我的生活弄清楚配置的差异。是否有任何明显的设置“BufferPostBody Yes”我应该寻找?

到目前为止我尝试了什么

禁用mod_security   通过HTTP而不是HTTP发送文件   检查apache日志,php日志,syslogs。没有错误或警告。

我如何测试行为

通过XHR流式传输大型文件(235M)的JS上传。一旦请求开始,PHP应该输出'执行上传'。相反,只有在通过POST上传整个文件后才能看到“执行上传”这一行。

坏服务器上加载的模块列表是:

芯 mod_log_config mod_logio 预派生 http_core mod_so mod_alias中 mod_auth_basic mod_authn_file模块 mod_authz_default mod_authz_groupfile mod_authz_host mod_authz_user mod_autoindex mod_cgi一样 mod_dir mod_env mod_mime mod_negotiation模块 mod_php5 mod_reqtimeout mod_rewrite的 mod_setenvif 了mod_ssl mod_status的 mod_unique_id

2 个答案:

答案 0 :(得分:2)

您需要将PHP设置enable_post_data_reading设置为Off。我发现这是PHP请求缓冲的原因,因此不允许流像流一样工作。

http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading

这会禁用$_POST$_FILES个变量,因此,如果您在应用的其余部分使用它们,则可能会出现问题。

为了解决这个问题,我的Apache配置只能在某些条件下启用它。

在这种情况下,位置和内容类型:

<Location /uri/to/path/file.php>
    <If "req('Content-Type') = 'application/customfiletype'">
        php_value enable_post_data_reading Off
    </If>
</Location>

答案 1 :(得分:1)

PHP假设整个POST请求都可用,所以在开始PHP之前等待帖子完成是我的设计,我相信。并且可能是不可避免的。

您可以做的是在浏览器中使用HTML5文件API拆分文件,然后逐个发送文件块,每个文件块都在自己的PHP POST请求中。

如何使用HTML5在浏览器中拆分文件的示例:http://www.html5rocks.com/en/tutorials/file/dndfiles/

HTML5文件API的浏览器支持:http://caniuse.com/#feat=fileapi(在fx IE中不起作用&lt; 10 :()