使用PHP上传大于2GB的文件

时间:2011-01-06 10:55:39

标签: post file-upload php

我正在尝试将大于2GB的文件上传到本地PHP 5.3.4服务器。我设置了以下服务器变量:

memory_limit = -1
post_max_size = 9G
upload_max_filesize = 5G

但是,在error_log中我找到了:

  

PHP警告:POST内容长度2120909412字节超过第0行未知的1073741824字节限制

有人可以告诉我为什么这会一直失败吗?

6 个答案:

答案 0 :(得分:6)

我遇到了类似的问题,但我的配置是:

post_max_size = 1.8G
upload_max_filesize = 1.8G

然而我无法上传1.2GB文件。错误非常相似:

PHP Warning:  POST Content-Length of 1347484420 bytes exceeds the limit of 1073741824 bytes in Unknown on line 0

我花了一天的时间想知道这个“极限1073741824”来自何处!

<强>解决方案

实际上,错误发生在php.ini解析器中:它只能理解INTEGER数字,所以基本上它将1.8G解析为1G !!

将值更改为例如1800M修正了它。

请确保使用以下命令重新启动apache服务器 service apache2 restart

答案 1 :(得分:3)

我在5.3.x中不知道,但在5.2.x中,PHP代码中存在一些int / long问题。即使您使用的是64位系统并且使用64位编译的PHP版本,也存在一些问题。

首先,将post_max_size和其他从ascii转换为整数的代码将值存储在int中,因此转换“9G”并将结果放入此int会使值变大,因为9G的数字大于32-位变量可以保存。

但是还有一些PHP代码的其他区域与Apache模块,CGI等一起使用,需要从int更改为long。

所以......要使其工作,您需要编辑PHP代码并手动编译(确保将其编译为64位)。这是一个差异列表的链接:

http://www.archive.org/~tracey/downloads/patches/karmic-64bit-post-large-files.patch

从这个php bug帖子中引用:http://bugs.php.net/bug.php?id=44522

上面的文件是5.2.10代码上的差异,但我只是手动更改为5.2.17代码,我刚刚通过apache / php上传了一个3.4gb的单个文件(在更改之前没有工作)。

操作有帮助。

答案 2 :(得分:2)

也许这可能来自POST大小的apache限制:

http://httpd.apache.org/docs/current/mod/core.html#limitrequestbody

似乎这对2Gb的限制在64位安装上可能会更大。而且我不确定在此指令中设置0是否达不到编译限制。参见线程示例:

http://ubuntuforums.org/archive/index.php/t-1385890.html

然后不要忘记改变PHP中的max_input_time。

但是你达到了极限:-)也许你可以在浏览器端尝试一个富客户端(flash?js?),用块或某种FTP进行传输,并为用户提供进度指示器。 / p>

答案 3 :(得分:1)

正如phliKtid所说,这是PHP框架的限制。保存用于编辑bug report phliKtid链接中提到的源代码,有一种解决方法,涉及在php.ini文件中将upload_max_filesize设置为0.

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 0

通过这样做,PHP在尝试将“5G”转换为32位整数时不会崩溃,并且您可以使用“post_max_size”变量上传文件大小。

答案 4 :(得分:1)

我弄清楚如何使用http和php上传10G文件。

的php.ini:

post_max_size = 0
upload_max_filesize = 0

它适用于php 5.3.10。

如果你没有将该文件全部加载到内存中,则memory_limit是不相关的。

答案 5 :(得分:0)

我们遇到了同样的问题:上传停止在2GB。

在SLES(SUSE Linux Enterprise Server)11 SP 2下,php53就是问题所在。

然后我们添加了一个具有php54的新存储库: http://download.opensuse.org/repositories/server:/php/SLE_11_SP2/

并升级到那个,我们现在可以上传5GB: - )