奇怪的500内部服务器错误(firebug,php,display_errors,ajax)

时间:2009-07-26 07:51:15

标签: php apache apc internal-server-error http-status-code-500

在一个页面上,我正在进行多个AJAX调用。所有调用都成功返回响应,但最后一个调用(与其他ajax调用无关)返回500内部服务器错误作为响应代码(如firebug所述)。但是,尽管存在错误代码,但从该AJAX调用返回了正确的内容。

令我惊讶的是,当我将php.ini中的display_errors选项设置为On时,错误消失并在页面上呈现响应。我已将错误记录设置为文件,但未记录与上述内部服务器错误相对应的错误。

顺便说一句,我使用的是Apache,JQuery,PHP5,APC(如果它是相关的)。

6 个答案:

答案 0 :(得分:3)

鉴于可用信息有限,最可能的答案是PHP在完成回显预期输出后达到致命错误

测试:在最后执行的行中,回显一些东西。如果没有显示回声,那么您就知道您的PHP脚本正在停止某个地方。那时,只需要调试和跟踪。

答案 1 :(得分:2)

这很奇怪......您使用某种类型的库或其他您没有编写的代码,这些代码可能会影响状态代码标题而与实际返回的值无关吗?

答案 2 :(得分:2)

我有同样的问题,原来是一个隐藏的致命错误。打开display_errors,查找错误,粉碎错误,关闭display_errors(最好保持display_errors开启以进行开发,然后关闭生产)。

答案 3 :(得分:0)

PHP解释器在这一个请求期间简单地崩溃。我知道一个可能导致PHP崩溃的潜在原因:

由于GCC 4.3中的一些错误,使用此版本的编译器编译的PHP实现了异常。在某些非平凡的情况下,脚本抛出异常会导致段错误并终止脚本执行。几个月前,PHP团队证实了这篇论文。

要验证,是否发生在您身上,您可以简单地检查脚本执行崩溃的位置,如果在抛出异常后发生,您就在家。可以通过在脚本中进一步放置die()并查看,会发生什么来完成检查。另一种方法是使用declare(ticks=1)并注册一个tick函数,将每个tick的debug_backtrace()的最后一个条目保存到文件中,这样你就可以得到一个报告,如何执行脚本。

答案 4 :(得分:0)

我有一些类似的问题,问题是脚本抛出了异常并且没有catch块,所以异常会冒泡到表面并发生致命错误“未捕获的异常”。这是标准的PHP行为,但在一个特定的服务器上,你也会得到500内部服务器错误而不是200 OK的响应代码。删除异常并用die()语句替换它们修复了该服务器上的问题(我们可以这样做,因为它是一个简单的脚本,实际上并没有从异常中获益)

答案 5 :(得分:0)

问题通常由以下因素决定。 检查脚本权限,权限和所有权。 如果在ajax调用后返回,请检查是否存在致命错误。 检查你是否在ASCII模式下意外地将文件上传到Unix。

可以在http://www.larshemel.com/forum/500_internal_server_error

阅读更多信息