【问题标题】:How to get more information about error 500 - internal server error?如何获取有关错误 500 - 内部服务器错误的更多信息?
【发布时间】:2015-12-09 16:57:46
【问题描述】:

我在我的 PHP 网站的许多部分都使用了$ajax 请求,直到几天前我所有的$ajax 请求都开始提供error 500 - internal server error。 我可以在控制台中看到该错误,并且我使用错误处理程序来获取有关该错误的更多信息。 那是我的 Ajax 请求

window.setInterval(function(){
         $.ajax({
            type: "GET",
            url: "include-ajax/is_it_midnight.php",
            dataType: "json",
            success: function(data)
            {
                if(data == 1)
                {
                    //Reload website at midnight
                    location.reload();
                }   
            },
                    error : function(XMLHttpRequest, textStatus, errorThrown) {
                        alert(XMLHttpRequest);
                        alert(textStatus);
                        alert(errorThrown);
                        alert(XMLHttpRequest.responseText);
                    }
        }); 

    }, 10000);

这就是我在浏览器上看到的:

is_it_midnight.php:

<?php
$current_hour = date('H');
$current_minute = date('i');
$current_second = date('s');
//If the website was open between the 00:00:00 and 00:00:10 it will refresh automatically
//else it will not be open it will open after midnight so it will have aleardy the new day data 
if($current_hour == 0 && $current_minute == 0 && ($current_second > 0 && $current_second < 10))
{
    $is_it_midnight = 1;//This flag means it is midnight
}
else
{
    $is_it_midnight = 2;//This flag means it is not midnight
}
echo json_encode($is_it_midnight);
?>

一些注意事项: 1. 它不是一直给出这个错误,有时它可以正常工作并正确带来响应(我在网站上看到响应和标题信息,当我在 chrome 控制台中检查网络选项卡时)。 2. 类型是 GET 还是 POST 都没有关系,它总是给我同样的问题(我用 GET 类型展示了这个 ajax 示例,但我的网站中也有 POST 类型的请求,有同样的问题)。 3. 我将ini_set('display_errors',1);``ini_set('display_startup_errors',1);``error_reporting(-1); 添加到is_it_midnight.php 的开头,但没有显示错误,因为我相信没有语法或任何其他php 错误(因为有时它可以正常工作)。 4. 我还检查了服务器错误日志,但根本没有与此文件或任何其他 ajax 文件相关的内容。 5. 我试图检查这是否是超时错误,但我没有从textStatus 得到任何timeout 它只是提醒error

更新:
我检查了 apache 日志,发现如下内容:[Sat Feb 21 07:35:05 2015] [error] [client 176.40.150.195] Premature end of script headers: is_it_midnight.php, referer: http://www.example.com/index.php

我需要任何有用的帮助或线索来了解我为什么会收到此错误,有什么我没有尝试过以获取有关该错误的更多信息吗???

【问题讨论】:

  • 只需检查您的 PHP 错误日志。
  • 你检查你的 Apache 错误日志了吗?
  • @showdev 是的,这就是我所说的。这个错误并没有一直显示给我。我试图理解为什么它有时会显示???
  • 你确定你找对地方了吗?这看起来更像是访问日志条目而不是错误日志条目。

标签: php ajax apache http internal-server-error


【解决方案1】:

我不知道这是否对你有帮助,但我前段时间也遇到过同样的问题,我所做的唯一操作就是从我的 jquery ajax 函数中删除它

dataType: "json"

这是我制作的一些功能(“mostrar_alert_ui”是一个模态警报窗口功能,与“MostrarVentanaBoton”相同,是一个确认警报功能)

//Función ajax con alert
function Funciones_Ajax_conAlert(urlx, datax, callback, phpencode) {
    var TodoBien = false;
    $.ajax({
        type: "POST",
        url: urlx,
        data: datax,
        async: true,
        success: function (data) {
            if (phpencode == true) {
                data = $.parseJSON(data);   
            }
            console.log(data) //Solo para propositos de debug
            if (data.success) {
                MostrarVentanaBoton(data.titulo, data.mensaje, data.boton, callback);
            } else {
                mostrar_alert_ui(data.titulo, data.mensaje)
            }
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert("Failed " + urlx);
            alert(xhr.responseText);
            alert(thrownError);
        }
    });
}

为了以防万一,请仔细检查路线

【讨论】:

    【解决方案2】:

    如果不是每次脚本运行时都发生,那么我的猜测是:

    1. 内存不足。 (不太可能查看您的代码)
    2. 在托管文件的服务器上达到最大连接数。 (您的房东应该有一些工具可以用来获取统计信息)
    3. 您的 PHP 脚本部署在多台服务器上,在负载平衡器后面运行,其中一台服务器的 PHP 文件版本损坏,或 PHP 安装损坏,或 Web 服务器(或 Web-服务器配置)。每当客户端请求在该损坏的服务器上结束时,您都会得到 500。

    【讨论】:

      【解决方案3】:

      嗯,“脚本头过早结束”很常见,而且可能性很小。它表明 PHP 脚本在发送任何输出之前由于某种原因已停止。这与 AJAX 本身无关。

      可能性:

      1. Apache 配置错误

      升级或降级到不同版本的 PHP 可以离开 httpd.conf 中的剩余选项。检查当前 PHP 版本 在命令行上使用 php -v 并搜索任何提及的行 httpd.conf 中的另一个版本。如果你找到了,把它们注释掉, 提取 httpd.conf 并重新启动 apache。

      检查您的 Apache 配置是否有任何更改并修改 PHP 的模块列表(尝试一一禁用它们)。

      2。资源限制

      httpd.conf 中的 RLimitCPU 和 RLimitMEM 指令也可以是 如果脚本因资源而被杀死,则对错误负责 限制。

      3.第三方扩展

      suEXEC、mod_perl 或其他第三方中的配置问题 模块通常会干扰脚本的执行并导致 错误。如果这些是原因,有关的附加信息 详细信息将在 apache error_log 中找到。

      4. SuPHP 崩溃

      如果 suphp 的日志大小达到 2GB 或更大,您可能会看到过早的 脚本标题错误的结尾。查看日志包含的内容以及 gzip 或 null 它。重新启动 apache,然后处理任何问题 suphp 日志曝光。 suphp 日志位于: /usr/local/apache/logs/suphp_log

      5.文件权限

      脚本的权限也可能导致此错误。 CGI 脚本可以 只允许访问指定的用户和组的资源 httpd.conf。在这种情况下,错误可能只是指出一个 未经授权的用户正在尝试访问脚本。

      如您所见,可能性很小。你提到它只是有时会崩溃,所以它可能与资源或配置有关。例如 - 如果您的服务器负载过重,Apache 可以拒绝您的请求并抛出这个通用的“脚本头过早结束”错误。

      你已经尝试了什么?

      【讨论】:

        【解决方案4】:

        您是否检查过服务器上的文件权限?网络服务器用户必须能够读取您要访问的文件。另请参阅 (https://stackoverflow.com/a/17626018/3972213)

        更新: 如果您使用的是 apache2 并且可以访问配置,则可以通过打开取证日志 (http://httpd.apache.org/docs/2.2/mod/mod_log_forensic.html) 来获取有关每个请求的更多信息。希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          首先你必须确保错误日志机制配置良好。

          为此添加以下代码或类似代码:

          ini_set("log_errors", 1);
          ini_set("error_log", "/tmp/php-error.log");
          error_log( "Php Errors!" );
          

          我注意到的另一个问题是您的 php 脚本没有返回 100% 有效的 JSON,而且我还认为您可以重构代码以返回结果而无需创建任何变量(更好的性能、更快的 lees 代码) 避免任何类型的内存分配问题。

          在某些情况下,负载过重的共享服务器或不可扩展的 VPS 会试验非常低的内存,并在尝试为变量分配内存时随机产生错误。

          我不知道你是否使用某种框架,但是用纯 php 编写脚本的另一种方式可能是这样的:

          header('Content-Type: application/json');
          return (date('H') == 0 AND date('i') == 0 AND (date('s') > 0 AND date('s') < 10)) ? json_encode(['res' => 1]) : json_encode(['res' => 2]);
          

          此代码将始终返回有效的 JSON 格式,例如 {"res":1}{"res":2},您可以像 res = data.res; console.log(res); 那样轻松访问这个低谷 JS,您将像这样评估它:(data.res === 1)

          在您的情况下,您使用的是dataType: "json",并且在几乎所有情况下,如果您的 php 没有返回有效的 JSON,它就不会正常工作。也许您考虑将其删除,如果您不被强制要求只期望有效的 JSON,这并不是很重要。

          您可以试一试,看看会发生什么。 如果错误仍然存​​在,您可以在 /tmp/php-error.log 文件中看到它。并与您的托管公司评论。

          作为括号,我想补充一点,您的脚本应该返回 1 或 0、true 或 false 而不是 1 或 2。这只是一种更务实的方式。

          如果我的回答有帮助,或者您无法解决问题,请告诉我,我会尽力帮助您。

          再见!苏尔特!

          【讨论】:

            【解决方案6】:

            很可能您的主机最近对其服务器进行了更新,这导致了问题。

            您应该建议他们查看内存消耗,并可能尝试将 Apache 内存限制参数:“RLimitMEM”增加到上限,这是此类错误的常见因素。

            【讨论】:

              【解决方案7】:

              我的猜测是,由于您主机上的一些(错误)配置,PHP 进程被服务器杀死(我怀疑使用了mod_fastcgi/mod_fcgid;您可以使用phpinfo() 进行检查)。此外,您每 10 秒执行一次调用,这可能会达到一些限制。在你的情况下我会怎么做:

              • 检查 PHP 是否适用于 mod_fastcgi/mod_fcgidServer API 字段在phpinfo())。
              • 检查 Apache access_log 并查看脚本 is_it_midnight.php 的状态代码 500 是否存在模式。
              • 尝试将setInterval的刷新时间增加到15s、20s、25s、30s等,看看有没有改善。
              • error_log (memory_get_usage()); 放在echo json_encode($is_it_midnight); 之前,以查看分配给脚本的内存使用情况(尽管鉴于脚本很小,内存使用不太可能成为问题)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-29
                • 2015-07-13
                • 1970-01-01
                • 2022-10-12
                相关资源
                最近更新 更多