我想在他们尝试上传的文件太大时向我的客户显示有意义的消息。
现在,当我尝试发送过大的请求时,我的mod_fcgid
会引发500内部服务器错误。我不知道如何通过以下方式告知此错误:
display_errors
设置为0时的PHP错误如果我要告诉我的客户"嘿,你试图上传太大的文件"在500 ISE处理程序中,它也会触发上述所有内容,这没有任何意义。
我目前唯一能做的就是使用ErrorDocument 500 /generic-500.php
重定向所有错误。转储$_SERVER
和$_REQUEST
并没有显示任何有用的信息。
我可能以丑陋的方式绕过问题:
但它相当愚蠢,而且我必须记住为每个上传表单都这样做。
如何在PHP中检测500 ISE的原因或重新配置我的服务器,以便在接收到POST请求时我可以在PHP中检测到过大的上传?
答案 0 :(得分:1)
这很奇怪,但由于服务器中断请求未完成,因此您无法知道请求的长度。
您可以做的最好的事情是使用FcgidMaxRequestLen指令增加对请求正文大小的限制。在服务器处理请求而不产生任何500服务器错误并到达应用程序后,您可以验证应用程序中的内容并向用户返回有意义的消息。
答案 1 :(得分:1)
转储
$_SERVER
和$_REQUEST
[500错误处理脚本]并没有显示任何有用的信息。
$_SERVER['CONTENT_LENGTH']
怎么样,你检查过了吗?如果该值在错误处理脚本中仍然“完整”并且具有客户端最初发送的值,那么可能会继续这样做。
除此之外,用PHP做出这样的错误似乎很难 - 首先必须在mod_fcgid
级别处理,这样它仍然调用脚本(或任何脚本,与此有关)及相关信息;但从文档中我看不到任何方法。
作为解决方法,您可以尝试专门针对作为处理文件上传的端点的脚本设置不同的 ErrorDocument
脚本 - f.e.通过在FILES
指令中使用该指令,该指令仅包含您的上传处理脚本
这样,如果你的“特殊”500错误脚本被调用,那么上传文件太大的原因可能很大 - 你可以告诉用户最有可能他们看到这个错误页面的原因是那个。
当然,您必须尽一切努力确保没有其他原因,为什么这些脚本可能会出现特定的500 - 正如您已经说过的那样,这有点像p.i.t.a.也是,甚至可能不可能以完全可靠的方式......但也许这是一个开始。
最重要的是,在上传开始之前尝试防止这种情况发生可能是一个好主意,客户端 - 在文件上传字段中添加maxlength
属性可能不会停止每个每个现有的浏览器都在那里,但对于那些做尊重它的人来说,它可能有助于在问题发生之前解决问题。 (HTML5已经指定了该属性;虽然我还没有检查它以什么方式与HTML5表单验证结合使用,以警告用户在这种情况下的具体错误原因。)
作为旁注:从HTTP的角度来看,在这种情况下回复状态代码500似乎不合适 - 413 Request Entity Too Large
存在,并且应该将IMHO视为正确的在这种情况下的反应。太糟糕mod_fcgid
不会自动执行此操作,因为这样可以基本上解决问题而无需进一步努力。
答案 2 :(得分:0)
set_file_buffer($ f,$ b)怎么样?你可以在那里设置缓冲区大小 - 如果你不能做到这一点,我会使用输出缓冲区方法来控制它......