当通过XHR流将文件上传到运行在Apache When服务器上的PHP脚本时,会有一些东西在缓冲整个POST正文,然后在上传完整个文件后将其传递给PHP。
这是非常内存密集型的,不是最优的。我有另一台服务器,配置方式大致相同,它直接将POST数据流到PHP脚本,从而导致内存使用率低。
我一辈子都找不出配置上的差别。有什么明显的东西像"BufferPostBody是的“这样的设置需要我去寻找吗?
我到目前为止尝试过的
禁用通过HTTP发送文件的mod_security,而不是检查apache、php日志、syslog的HTTPs。没有出现错误或警告。
我是如何测试行为的
开始上传通过JS的大文件(235米)通过XHR流。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_env mod_negotiation mod_env mod_env mod_negotiation mod_env mod_negotiation mod_env mod_env mod_negotiation mod_env mod_negotiation mod_env mod_mime mod_env mod_negotiation mod_env mod_env mod_negotiation mod_env mod_negotiation mod_env mod_env mod_mime mod_env mod_env mod_mime mod_env mod_negotiation mod_env mod_negotiation mod_env mod_env mod_negotiation mod_env
发布于 2015-01-21 12:53:14
您需要将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>
发布于 2014-01-04 15:59:38
PHP假定整个POST请求是可用的,所以我相信,在启动PHP之前等待post完成是每个设计的结果。而且可能是不可避免的。
您可以做的是在浏览器中使用HTML5文件API拆分文件,然后将文件块一个一个地发送,每个文件块在自己的POST请求中发送。
如何使用HTML5:http://www.html5rocks.com/en/tutorials/file/dndfiles/在浏览器中拆分文件的示例:
浏览器对HTML5文件API:http://caniuse.com/#feat=fileapi的支持(在fx IE<10 :( )中不工作)
https://stackoverflow.com/questions/18664696
复制相似问题