【问题标题】:Memory limits on big PHP uploads大型 PHP 上传的内存限制
【发布时间】:2013-02-01 20:20:56
【问题描述】:

我有一个应用程序。这使您可以通过 ajax 一次上传多个文件。它适用于大文件,但一旦达到 2gb+,我就会遇到如下错误:

[Fri Feb 01 11:22:56 2013] [error] [client x.x.x.x] PHP Fatal error:  Out of memory (allocated 2331770880) (tried to allocate 1165449891 bytes) in Unknown on line 0, referer: ...

在我的 php.ini 中,我有这些配置:

post_max_size = 53687091200M
upload_max_filesize = 53687091200M
max_input_time = -1
memory_limit = -1
max_execution_time -1
max_file_uploads = 20

据我所知,这应该足以处理 3GB 的上传。但几乎每次尝试,我都会遇到这些错误。我已经与我的 VPS 支持人员进行了交谈,他们说一切看起来都很好,应该能够处理它。

我有一个 nginx 反向代理设置,它有点帮助,但还不够。我错过了什么吗?

有没有办法用 PHP 减轻 HTTP 的负担?我测试了 Java 应用程序,它们的表现非常出色,但(不幸的是)我需要保持 UI 完好无损。

【问题讨论】:

  • PHP 并不适合上传多 GB 文件。最好使用 Java,然后让 PHP 处理它。
  • 有什么建议吗?任何我可以用来“隐藏在背景中”的东西,我不知道?仍然能够显示漂亮的 UI? :)
  • 您通过ajax上传时是否尝试过拆分文件?也许可以解决通过队列保持上传大小
  • 其实是HTTP,不太适合多GB文件上传。

标签: php apache upload nginx


【解决方案1】:

如果您要上传非常大的文件,您可能希望在将它们传递给 PHP 之前“代理”它们。我的经验是,长期存在的 PHP 线程可能会意外崩溃,而且 PHP 有时会在分配大量内存时遇到问题。

看看nginx's upload progress module,它会在将文件传递到上游服务器(在本例中为 PHP)之前将文件缓冲到磁盘,另外还有一个好处是提供了一种监控和报告进度的机制。

如果您仍然遇到问题,您可以使用upload module 将 PHP 完全排除在外(就管理上传而言);只需将文件直接转储到磁盘上您需要它的位置并通知 PHP 它的下落即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 2011-09-19
    • 2016-01-25
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多