当通过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
答案 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 :()