4

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

这是非常占用内存的并且不是最优的。我有另一台服务器以大致相同的方式配置,将 POST 数据直接流式传输到 PHP 脚本,导致内存使用率低。

我一生都无法弄清楚配置差异。我应该寻找什么明显的设置“BufferPostBody Yes”吗?

到目前为止我尝试过的

禁用 mod_security 通过 HTTP 而不是 HTTPs 发送文件 检查 apache 日志、php 日志、syslogs。不存在错误或警告。

我如何测试行为

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

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

核心 mod_log_config mod_logio prefork 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

4

2 回答 2

3

您需要将 PHP 设置设置enable_post_data_readingOff. 我发现这是 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>
于 2015-01-21T12:53:14.920 回答
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<10 中不起作用:()

于 2014-01-04T15:59:38.910 回答