4

目标

当他们尝试上传的文件太大时,我想向我的客户显示有意义的消息。

问题

现在mod_fcgid,当我尝试发送太大的请求时,我会抛出 500 Internal Server Error。我不知道如何从以下内容中分辨出此错误:

  • PHP错误时display_errors设置为 0
  • 请求 uri 太长
  • 错误的重写规则
  • 其他不良配置
  • 完全不同的东西

如果我要在 500 ISE 处理程序中告诉我的客户“嘿,你试图上传太大的文件”,它也会触发以上所有内容,这是没有意义的。

我尝试过的事情

我目前唯一能做的就是使用ErrorDocument 500 /generic-500.php. 倾倒$_SERVER$_REQUEST没有显示任何有用的东西。

可以通过以下方式以丑陋的方式绕过问题:

  1. 在表单上创建 AJAX 包装器
  2. 使它单独为这个表单附加自定义标题
  3. 当我被重定向到 500 ISE 时检查此标头

但这很愚蠢,我必须记住为每个上传表单都这样做。

问题

如何在 PHP 中检测 500 ISE 的原因或重新配置我的服务器,以便在收到 POST 请求时检测到 PHP 中的上传过大?

4

3 回答 3

1

这很奇怪,但您无法知道请求的长度,因为请求因您的服务器中断而未完成。

您可以做的最好的事情是使用FcgidMaxRequestLen指令增加对请求正文大小的限制。在您的服务器处理请求且未产生任何 500 服务器错误并到达应用程序后,您可以验证应用程序中的内容并向用户返回有意义的消息。

于 2014-06-01T19:19:12.290 回答
1

转储$_SERVER$_REQUEST[inside 500 error handling script] 没有显示任何有用的信息。

怎么样$_SERVER['CONTENT_LENGTH'],你检查过吗?如果该值在错误处理脚本中仍然“完整”并且具有客户端最初发送的值,那么可能会继续进行。

除此之外,似乎很难对 PHP 的此类错误做出反应——首先必须在mod_fcgid级别进行处理,以便它仍然使用相关信息调用脚本(或任何脚本);但是从文档中我看不到任何方法可以做到这一点。

作为一种解决方法,您可以尝试为作为处理文件上传的端点的脚本专门设置一个不同 的脚本 - fe 通过在指令中使用该指令,该指令仅包含您的上传处理脚本。 这样,如果您的“特殊” 500 错误脚本被调用,则很有可能是因为上传了太大的文件——您可以告诉用户,这是他们最可能的原因看到这个错误页面就是这样。 当然你必须尽你所能确保没有其他的ErrorDocumentFILES

这些脚本可能会出现 500 的原因——正如你已经说过的,这也有点像皮塔饼,甚至可能无法以完全可靠的方式出现……但也许这是一个开始。

最重要的是,在客户端上传甚至开始之前尝试防止这种情况发生可能是一个好主意 - 向maxlength文件上传字段添加属性可能不会阻止每个现有的浏览器,但是对于那些尊重它的,它可能有助于在问题发生之前缓解问题。(HTML5 已经指定了该属性;虽然我还没有检查过它可以以何种方式与 HTML5 表单验证结合使用,以在这种情况下提醒用户特定的错误原因。)


附带说明:从 HTTP 的角度来看,在这种情况下使用状态代码 500 回答似乎并不合适——413 Request Entity Too Large存在,并且在这种情况下应该将恕我直言视为正确的响应。太糟糕了mod_fcgid不会自动这样做,因为这基本上可以解决问题而无需进一步努力。

于 2014-06-01T19:59:42.083 回答
0

set_file_buffer($f, $b) 呢?你可以在那里设置缓冲区大小 - 如果你不能让它工作,我会使用输出缓冲区方法来控制它......

于 2014-06-01T19:19:04.480 回答