广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何解决php 500错误问题
  • 210
分享到

如何解决php 500错误问题

php500错误 2017-05-15 18:05:08 210人浏览 绘本
摘要

本文操作环境:windows7系统、PHP7.1版、Dell G3电脑。如何解决php 500错误问题?PHP与500错误php开发过程中经常会遇到返回500错误的情况,而且body体中也没有任何调试(可用)内容。这个时候你就需要慢慢调试

本文操作环境:windows7系统、PHP7.1版、Dell G3电脑。

如何解决php 500错误问题?

PHP与500错误

php开发过程中经常会遇到返回500错误的情况,而且body体中也没有任何调试(可用)内容。这个时候你就需要慢慢调试了(打断点,开调试模式等),但如果是现网,这个错误就比较让人抓狂了,既不好打断点也不能开调试模式。但既然是错误,总是会有处理方法,下面就一步步分析500的成因及处理方案。

0x01、500错误

500错误,也叫Internal Server Error(内部服务错误),表示服务因未知错误导致无法处理请求。在PHP站点中一般是由PHP返回,也就是说,500错误一般都是PHP脚本的错误。

d961c8b11941089ffec544f8f3a1322.png

php-fpm抓包500

从上图中可以看出(Nginx+PHP-FPM架构),在PHP调用一个不存在的类时,脚本发生错误并返回500给Nginx(并且将错误信息也做了返回,只不过是卸载STDERR中)。

0x02、哪些错误异常会导致500

那么哪类错误会导致500错误呢,PHP所有的错误级别可以在PHP的官方文文档(Http://php.net/manual/zh/errorfunc.constants.php)中查询到,而这其中错误级别为E_ERROR、E_PARSE、E_RECOVERABLE_ERROR、E_USER_ERROR以及未捕获的异常等都会导致500错误。

e7ce6aefccaa7eec2aa130c1f320e0e.png

E_ERROR级别错误导致的500

0x03、什么情况下错误不会返回500

上面说了,这个是PHP脚本的错误导致的,但是PHP脚本有了错误或异常一定会导致500吗?显然不是,即使在脚本有致命错误的情况下,依旧可以返回200。

4ec263743581382fc44167b986f7d46.png

display_errors配置选项

在基于pythonnodejs等的WEB应用中,默认情况下,如果出现异常信息会被打印到控制台(STDERR/STDOUT)中。而在基于PHP-FPM架构的PHP中没有控制台可以打印,它的stderr和stdout被置为FastCGI中对应的STRDERR和STDOUT。如果将错误重定向到STDOUT中,错误会直接输出到响应中,并且状态码也会置为200。这个也是display_errors选项所实现的能力。

display_errors选项的配置需要通过ini_set来实现,PHP文档中关于display_errors的配置表明该值为字符串类型,实际使用中数字和布尔类型也可以打开或关闭该配置。

fb4c1464ae0d97dff87bb4b435e36dd.png

error_reporting配置

display_errors控制了PHP脚本发生错误时是否显示错误详情以及是否返回错误状态码,而error_reporting项则用来控制哪级别的错误可以被直接打印出来。

error_reporting的设置项可以通过error_reporting(E_ALL)或ini_set('error_reporting', E_ALL)来配置,函数参数的详情可以参考PHP文档。

需要注意的是,PHP本身是有错误日志的(error_log和log_errors两个配置项目),若发生错误,PHP会将改错误写入错误日志中,而哪些错误需要被写入是受error_reporting项的控制的。

4ec263743581382fc44167b986f7d46.png

在错误级别不匹配的情况下不显示错误详情

0x04、现网如何合理处理500

500错误发生已经说明PHP脚本无法正常运行了,这时候能做的只是捕获异常并记录异常到日志,以方便日后的调试和现网bug的处理。


PHP自带错误日志

PHP本身已经带了错误日志的记录,可以在php.ini中将log_errors项设置为On,并配合error_log配置项来指定错误日志的存放路径。

eb14705dc9c603fecbc945233c10755.png

错误日志记录开关

6503e8bb8c4379d5161c53fe7c3c1cf.png

日志路径设置

该错误日志的的写入不受display_errors的配置的控制。也就是说不管display_errors是否开启,错误都会记录到日志中。但是却受error_reporting配置的控制,如果当前错误级别跟error_reporting中的错误级别不匹配的话,错误不会写入日志中。即如果错误级别是E_ERROR,但是设置却为error_reporting(E_NOTICE),那么日志中不会出现E_ERROR的出错信息。

fdc393b90790a44d9ce03d25c8f43a5.png

PHP错误日志记录各种类型的错误

4b9fb538e6433f6169123a6c732509f.png

错误级别不匹配导致的日志不写入

捕获错误异常记录

PHP提供了set_error_handler、reGISter_shutdown_function、set_exception_handler、error_get_last等相关的错误处理函数。可以通过函数将捕获到的错误信息写入指定日志来实现错误的记录。

函数的使用详情可以参考http://km.oa.com/group/19368/articles/show/302491,这里提供一个模版:

$previousHandler = set_exception_handler(function(Exception $ex) use (&$previousHandler) {
    call_user_func('exceptionHandler', $ex, $previousHandler);
});
set_error_handler('errorHandler');
register_shutdown_function('fatalErrorHandler');
function exceptionHandler(Exception $ex, $previousHandler)
{
    $info = array(
        $ex->getFile(),
        $ex->getLine(),
        $ex->getCode(),
        $ex->getMessage()
    );
    // 记录日志
    logPHPError($info);
    if (isset($previousHandler) && is_callable($previousHandler)) {
        call_user_func($previousHandler, $ex);
    }
}

function errorHandler($errno = 0, $errstr = '', $errfile = '', $errline = 0)
{
    switch ($errno) {
        case E_WARNING:
            $errname = 'E_WARNING';
            break;
        case E_NOTICE:
            $errname = 'E_NOTICE';
            break;
        case E_STRICT:
            $errname = 'E_STRICT';
            break;
        case E_RECOVERABLE_ERROR:
            $errname = 'E_RECOVERABLE_ERROR';
            break;
        case E_DEPRECATED:
            $errname = 'E_DEPRECATED';
            break;
        case E_USER_ERROR:
            $errname = 'E_USER_ERROR';
            break;
        case E_USER_WARNING:
            $errname = 'E_USER_WARNING';
            break;
        case E_USER_NOTICE:
            $errname = 'E_USER_NOTICE';
            break;
        case E_USER_DEPRECATED:
            $errname = 'E_USER_DEPRECATED';
            break;
        default:
            restore_error_handler();
            return false;
    }
    // 记录日志
    $info = array(
        $errfile,
        $errline,
        $errname,
        $errstr
    );
    logPHPError($info);
    restore_error_handler();
    return false;
}

function fatalErrorHandler()
{
    if (($e = error_get_last()) && $e['type'] === E_ERROR) {
        $info = array(
            $e['file'],
            $e['line'],
            'E_ERROR',
            $e['message']
        );
        // 记录日志
        logPHPError($info);
    }
}

0x05 总结

总结起来,error_reporting是用于控制向浏览器或PHP错误日志输出错误信息级别的函数或配置,而display_errors则是控制是否向浏览器输出错误和告警信息。

由于PHP的错误日志是全局的,而且受到error_reporting的控制,因此推荐在业务中实现自己的错误(异常)捕获记录逻辑。

--结束END--

本文标题: 如何解决php 500错误问题

本文链接: https://www.lsjlt.com/news/968.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决php 500错误问题
    本文操作环境:Windows7系统、PHP7.1版、Dell G3电脑。如何解决php 500错误问题PHP与500错误PHP开发过程中经常会遇到返回500错误的情况,而且body体中也没有任何调试(可用)内容。这个时候你就需要慢慢调试了...
    99+
    2017-05-15
    php 500错误
  • 如何解决iis6 php 500错误问题
    本文操作环境:Windows7系统、PHP7.1、Dell G3。如何解决iis6 php 500错误问题?IIS网站访问php页面提示 500 错误解决方法1(曾经试过,这个方法会导至同服务器下另外已在用的网站php无法正常访问显示为50...
    99+
    2020-08-17
    iis6 php 500
  • 如何解决win2008 php 500错误问题
    本文操作环境:win2008系统、PHP5.6版,DELL G3电脑如何解决win2008 php 500错误问题?win server 2008 r2 iis+php 500错误内部服务器错误今天遇到一个错误是iis 500错误,因为服务...
    99+
    2020-09-26
    php 500错误
  • 怎么解决iis6 php 500错误问题
    本篇内容介绍了“怎么解决iis6 php 500错误问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!iis6 php 500错误的解决办法...
    99+
    2023-06-21
  • 怎么解决php中500错误问题
    这篇文章主要为大家展示了“怎么解决php中500错误问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么解决php中500错误问题”这篇文章吧。php 500错误的解决办法:1、检查PHP脚本...
    99+
    2023-06-22
  • 如何解决php 535错误问题
    本文操作环境:Windows7系统、ThinkPHP5版、DELL G3电脑如何解决php 535错误问题解决 TP5 模板不存在 app.php 535错误删除项目data文件夹内的runtime文件夹,然后在浏览器界面按ctrl+F清除...
    99+
    2021-12-11
    php 535
  • 如何解决php redis502错误问题
    本文操作环境:Windows7系统、PHP5.5.30版、DELL G3电脑如何解决php redis502错误问题php redis set 时 nginx 502 解决PHP Version 5.5.30-1+deb.sury.org~...
    99+
    2017-09-28
    php redis
  • 如何解决php mail错误问题
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑如何解决php mail错误问题?php的mail()函数出错的问题<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1....
    99+
    2015-10-23
    php
  • 如何解决php cgi.exe 错误问题
    本文操作环境:Windows10系统、PHP7.1版、DELL G3电脑如何解决php cgi.exe 错误问题php-cgi.exe –应用程序无法正确启动运行php-cgi.exe并单击一个弹出对话框,显示以下错误消息:Applicat...
    99+
    2019-07-14
    php cgi
  • 如何解决php7提示500错误
    本篇内容介绍了“如何解决php7提示500错误”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php7提示500错误的解决办法:1、找到Vis...
    99+
    2023-06-25
  • 如何解决make hash php错误问题
    本文操作环境:macOS 10.15.7系统、php7.3.24版、DELL G3电脑本机测试环境是 macOS 10.15.7, nginx 1.19, php7.3.24 ,macbook air2017电脑如何解决make h...
    99+
    2019-10-06
    php make
  • 如何解决linux php date 错误问题
    本文操作环境:linux5.9.8系统、PHP7.1版、DELL G3电脑如何解决linux php date 错误问题linux与php时间函数有关的错误解决 最近在程序里写了不少获取时间或时间戳的函数date() strtotime...
    99+
    2018-08-21
    linux php date
  • 如何解决php mysql query 错误问题
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑如何解决php mysql query 错误问题?mysql_query函数执行不成功的几种可能性如下:没有权限访问查询语句中引用的表查询的sql语句有语法错误mysql...
    99+
    2019-05-18
    php mysql_query
  • 如何解决火车头php错误问题
    本文操作环境:Windows7系统,PHP5.6版,Dell G3电脑。如何解决火车头php错误问题?遇到火车头采集器php插件语法错误,替换php高版本火车头之前很久用过!写的php插件很久了!然后今天写了采集豆瓣的php插件,发现一直提...
    99+
    2016-11-13
    php
  • DedeCMS因php低版本出现500错误如何解决
    这篇文章主要介绍了DedeCMS因php低版本出现500错误如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇DedeCMS因php低版本出现500错误如何解决文章都会有所收获,下面我们一起来看看吧。问题原...
    99+
    2023-07-05
  • eclipse运行程序错误500如何解决
    Eclipse运行程序错误500通常是由于程序出现了内部服务器错误或者代码中存在bug引起的。解决此问题可以尝试以下方法:1. 检查...
    99+
    2023-09-23
    eclipse
  • 运行tomcat页面错误500如何解决
    运行Tomcat时出现错误500可能是由于以下几个原因引起的:1. 代码错误:检查你的代码是否有语法错误或逻辑错误,特别是检查最近更...
    99+
    2023-09-22
    tomcat
  • 怎么解决php cgi.exe 错误问题
    这篇文章主要介绍怎么解决php cgi.exe 错误问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php cgi.exe错误的解决办法:1、执行“c:\php7.1>php-cgi.exe -b 127.0...
    99+
    2023-06-25
  • 怎么解决php redis502错误问题
    今天给大家介绍一下怎么解决php redis502错误问题。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。php redis502错误的解决办法:1、使用“su...
    99+
    2023-06-29
  • 怎么解决php 535错误问题
    今天小编给大家分享一下怎么解决php 535错误问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。php 535错误的解决办...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作