PHP警告:POST内容 - n个字节的长度超过了第0行的Unknown中的3145728个字节的限制

Que*_*low 9 php

我很惊讶在我的错误日志中找到上述错误,因为我认为我已经完成了必要的工作以捕获我的PHP脚本中的错误:

if ($_FILES['image']['error'] == 0)
{
 // go ahead to process the image file
}
else
{
 // determine the error
 switch($_FILES['image']['error'])
 {
  case "1":
  $msg = "Uploaded file exceeds the upload_max_filesize directive in php.ini.";
  break;
  ....
 }
}
Run Code Online (Sandbox Code Playgroud)

在我的PHP.ini脚本中,相关设置是:

memory_limit = 128M
post_max_size = 3M
upload_max_filesize = 500K
Run Code Online (Sandbox Code Playgroud)

据我所知,3M相当于3145728字节,这就是触发错误的原因.如果文件大小超过500K但小于3m,PHP脚本将能够按照正常运行,在发出错误信息$msgcase 1.

当帖子大小超过post_max_size但仍然在内存限制范围内时,如何捕获此错误而不是让脚本突然终止并发出PHP警告?我在这里,这里这里看过类似的问题,但找不到答案.

Que*_*low 15

找到了一种不直接处理错误的替代解决方案.以下代码由软件工程师Andrew Curioso在其博客中撰写:

if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) &&
     empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0)
{
  $displayMaxSize = ini_get('post_max_size');

  switch(substr($displayMaxSize,-1))
  {
    case 'G':
      $displayMaxSize = $displayMaxSize * 1024;
    case 'M':
      $displayMaxSize = $displayMaxSize * 1024;
    case 'K':
       $displayMaxSize = $displayMaxSize * 1024;
  }

  $error = 'Posted data is too large. '.
           $_SERVER[CONTENT_LENGTH].
           ' bytes exceeds the maximum size of '.
           $displayMaxSize.' bytes.';
}
Run Code Online (Sandbox Code Playgroud)

正如在他的文章中解释说,当投递大小超过post_max_size的超级全局数组$_POST$_FILES将成为空.因此,通过测试这些并确认使用POST方法发送了一些内容,可以推断出发生了这样的错误.

实际上有一个类似的问题在这里,这是我没能更早发现.