1

我正在使用 http post 请求将文件从一台主机传输到另一台主机。接收主机运行带有 php 的 apache。该请求包含 multipart/form-data 并由 php 脚本 (cURL) 执行。有 86 个文件,总大小约为 20Mb。问题是接收 php 脚本的 $_POST 数组为空。我重新配置了发送脚本,因此它在循环中发送相同的请求,但在每次迭代时从数据收集中删除一个文件。当 36 个文件(总大小 ~12Mb)被删除时,接收脚本接受数据,$_POST 变量被很好地填充。有什么问题?我已经查看了所有负责任的 php.ini 参数,因此它们包含合理的值。

  ini_set("post_max_size","510M"); 
  ini_set("memory_limit","400M"); 
  ini_set("upload_max_filesize","510M"); 
  ini_set("max_file_uploads","500"); 

有没有办法调查原因?我的意思是,error_log 不包含任何有用的东西。也许还有其他来源可以看到?

4

2 回答 2

3

post_max_size不能在运行时基于每个目录设置该值。即使您phpinfo()将反映更改,但在处理表单时它将被忽略,因此将恢复为默认值 8MB。

文件的总大小为 20MB 的事实证明了这一点,但是当您删除约 12MB 的文件时,脚本可以正常工作。

20 - 12 = 8MB // Therefore the script works

唯一的解决方案是在 中设置值php.ini,或者当您使用 Apache 时,您可以在http.conf.htaccess文件中设置值。

不久前我也遇到过这个问题,尽管它是在运行 IIS 的 Windows 上。但是,问题仍然相同。有关该问题的更多信息,请参阅此线程

事实证明,在 Windows 上,您只能为每个目录设置标记为 PHP_INI_USER 的 ini 指令。不幸的是,upload_max_filesize 和 post_max_size 都是 PHP_INI_PERDIR。来自http://php.net/manual/en/configuration.changes.php的 PHP 文档

该目录的设置对于从此目录或其任何子目录运行的任何脚本都是活动的。键下的值应具有 PHP 配置指令的名称和字符串值。值中的 PHP 常量不会被解析。但是,只有 PHP_INI_USER 中可更改的配置值可以这样设置,PHP_INI_PERDIR 值不能。

因此,即使 Plesk 具有更改这些指令的接口,并且即使 phpinfo() 接受了它们,它们也不会更改实际的最大上传大小。Plesk 不应允许您在 Windows 上更改这些,并且 phpinfo() 不应报告更改,但您能做什么。

于 2013-01-14T09:33:55.673 回答
1

检查您是否安装了Suhosin扩展。它有几个设置可以限制您可以通过 POST、GET 和 REQUEST 接收的数据量。suhosin.upload.max_uploads此外,它可以通过默认设置为 20来限制上传的文件数量。

当设置采取行动时,POST 数组通常会被截断。

此外,如果您要上传文件,请检查$_FILES数组,而不是$_POST.

于 2013-01-14T09:15:41.540 回答