这个问题似乎与臭名昭著的 2GB 限制直接相关,我不确定它是否是 32 位 PHP 问题。我已经看到与 HTTP 相关的评论不是为如此大的文件设计的。但是,在决定对迄今为止已证明有效的方法进行任何根本性改变之前,我宁愿用尽这个方向。正如标题所示,我需要上传 >2GB 的文件,迄今为止最大的 3.8GB。我有一个使用 jQuery-file-upload 构建的表单,在这些大文件开始之前,它发送任何文件(全部小于 <2GB)都没有问题。从 File-Upload 上传 3.8GB 可能需要 5 分钟,进度条完成到 100%。然而,上传后报告的错误是类型 1,表明文件大小限制已被违反。
如果我在上传期间监控服务器上的磁盘使用情况,它将具有以下示例属性:在上传之前,磁盘已使用 30%,随着上传的继续,此使用量增加,31%,32%....45%,46%等等 然而,在 2GB 左右,磁盘使用率下降到 30%,而客户端/浏览器文件上传继续。当服务器磁盘使用量停止增加时,客户端可能只有上传的 60%。然而,客户端仍然继续 100%,但没有被服务器接受,因为磁盘状态永远不会离开 30%。
我正在运行带有 Apache/2.2.22 (Ubuntu) 和 PHP 版本 5.3.10-1ubuntu3.2 的 64 位 Ubuntu(最新)经过多天的断断续续寻找解决方案后,我仍然无法在更改后上传 3.8GB 文件这么多设置。我将在下面列出这些更改,但在这个阶段,我认为这可能是一个 32 位 PHP 问题,所以如果有人能建议一个值得关注的链接或值得尝试的解决方案,我将不胜感激。
在 Apache2 中,我设置了以下内容:
- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
- LimitRequestBody to 4939212390
- php_value upload_max_filesize 4831838208
- php_value post_max_size 4939212390
在 php.ini 中,我设置了以下内容:
- UPLOAD_MAX_FILESIZE 4831838208
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M
如果我在服务器上运行以下命令,PHP 似乎没有 32 位问题,但现阶段我不确定。
php -r "echo PHP_INT_MAX;"
9223372036854775807
正如我所提到的,任何想法将不胜感激。
更新:
已经解决了这个问题,感谢@BogdanBurim 建议回归基础的方法:
我设法通过 HTTP 上传了一个 3.8 GB 的文件,设置如下:
在 Apache2 中,我设置了以下内容:
- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
- LimitRequestBody to 0
- php_value upload_max_filesize 0
- php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
- LimitRequestBody to 0
- php_value upload_max_filesize 0
- php_value post_max_size 4939212390
在 php.ini 中,我设置了以下内容:
- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M
此解决方案的唯一其他重要部分是必须从上传表单中删除 MAX_FILE_SIZE、HTML:
<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />
设置此设置不断导致 PHP 类型 2 错误,因此 php 无法处理设置的大于 32 位的整数。删除它会导致 PHP 类型 1 错误,直到我在任何地方将 UPLOAD_MAX_FILESIZE 更改为 0,嘿,现在它可以工作了!!!!