Yii 中的致命错误处理

2023-12-04

有没有办法通过电子邮件/记录基于 Yii 框架的项目中发生的 php 致命错误?

例如,可以将 Yii 配置为通过电子邮件发送“未定义变量”错误,但致命错误只能通过单独的、未集成到框架代码中的方式进行监控,这并不理想。


在 php 中,可以使用以下方法拦截致命错误register_shutdown_function()功能。

首先,我们添加“早”fatal and parse错误处理程序。它应该进入index.php。 此代码的目的是捕获在启动控制器之前可能发生的错误。由于我们正在捕获应用程序启动期间可能发生的错误,因此最好使用简单的 php,而不依赖任何外部库:

// Early fatal errors handler, it will be replaced by a full featured one in Controller class
// (given it does not have any parse or fatal errors of its own)
function earlyFatalErrorHandler($unregister = false)
{
    // Functionality for "unregistering" shutdown function
    static $unregistered;
    if ($unregister) $unregistered = true;
    if ($unregistered) return;

    // 1. error_get_last() returns NULL if error handled via set_error_handler
    // 2. error_get_last() returns error even if error_reporting level less then error
    $error = error_get_last();

    // Fatal errors
    $errorsToHandle = E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING;

    if ((!defined('APP_PRODUCTION_MODE') || APP_PRODUCTION_MODE) && !is_null($error) && ($error['type'] & $errorsToHandle))
    {
        $message = 'FATAL ERROR: ' . $error['message'];
        if (!empty($error['file'])) $message .= ' (' . $error['file'] . ' :' . $error['line']. ')';

        mail('[email protected]', $message, print_r($error, 1));

        // Tell customer that you are aware of the issue and will take care of things
        // echo "Apocalypse now!!!"; 
    }
}

register_shutdown_function('earlyFatalErrorHandler');

在这个阶段,我们仍然没有使用 Yii 错误处理程序或日志记录。首先,我们需要注册另一个关闭函数,它是我们基本控制器的一部分,并且可以使用 Yii 框架提供的标准错误处理和错误日志记录(这个想法和大部分代码都来自于 viitalets @http://habrahabr.ru/post/136138/)

请注意,只要解析错误不是实际控制器文件中的解析错误,而是模型、帮助程序、视图等外部文件中的解析错误,此函数就会通知解析错误。如果控制器中存在解析错误,早期处理程序将处理它。

此外,此函数允许呈现更好的错误页面,而不是转储致命错误文本或显示空白屏幕(如果 display_errors 关闭)。

/**
 * Controller is the customized base controller class.
 * All controller classes for this application should extend from this base class.
 */
class Controller extends CController
{
    // ...

    public function init()
    {
        register_shutdown_function(array($this, 'onShutdownHandler'));
        earlyFatalErrorHandler(true); // Unregister early hanlder
    }

    public function onShutdownHandler()
    {
        // 1. error_get_last() returns NULL if error handled via set_error_handler
        // 2. error_get_last() returns error even if error_reporting level less then error
        $error = error_get_last();

        // Fatal errors
        $errorsToHandle = E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING;

        if (!is_null($error) && ($error['type'] & $errorsToHandle))
        {
            // It's better to set errorAction = null to use system view "error.php" instead of
            // run another controller/action (less possibility of additional errors)
            Yii::app()->errorHandler->errorAction = null;

            $message = 'FATAL ERROR: ' . $error['message'];
            if (!empty($error['file'])) $message .= ' (' . $error['file'] . ' :' . $error['line']. ')';

            // Force log & flush as logs were already processed as the error is fatal
            Yii::log($message, CLogger::LEVEL_ERROR, 'php');
            Yii::getLogger()->flush(true);

            // Pass the error to Yii error handler (standard or a custom handler you may be using)
            Yii::app()->handleError($error['type'], 'Fatal error: ' . $error['message'], $error['file'], $error['line']);
        }
    }

    // ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii 中的致命错误处理 的相关文章

  • C++ 相当于 PHP 的 pack()

    我的问题很简单 有没有类似 PHP 的pack and unpack C STL 中的函数 如果没有 是否有其他方法可以实现相同的目标 https www php net pack https www php net pack Thanks
  • Codeigniter:Base_url 似乎不起作用

    我开发了一个简单的网站 可以从 Twitter 公共时间线获取推文 将其缓存 60 秒等等 我最近将主机从 Hostgator 移至 Mediatemple 我的网站之前在 Hostgator 上运行良好 我的应用程序不使用数据库连接 也不
  • PHP 换行符 (\n) 不起作用

    由于某种原因我无法使用 n使用 PHP 输出到文件时创建换行符 上面只写着 n 到文件 我尝试使用 n 同样 它只写 n 如预期 但我一生都无法弄清楚为什么在字符串中添加 n 不会创建新行 我也尝试过 r n但它只是附加 r n 到文件中的
  • 使用php在html页面中显示bbcode

    我已经有一个 bbcode 字符串 mybbcode b Hello word b 使用 php 我想在 html 页面中以 html 格式显示它 例如 div gt b hello word b div 基本上其他人已经对你说过了 但是如
  • TCPDF / FPDI 可以接受 PDF 作为字符串吗?

    是否可以将 TCPDF 或 FPDI PDF 作为字符串提供 我有一个传入的 PDF 数组作为字符串 但无法写入磁盘 我在文档中找不到与此相关的任何内容 如果没有 是否有一种有效的方法来从内存或作为对象存储 读取这些 PDF 将它们喂给 F
  • 如何在 PHP 中将默认日期设置为波斯日期?

    如何在 PHP 中将默认日期设置为波斯日期 说吧 如果我echo这个功能date Y m d 然后它会显示2018 03 05但我想要1396 12 14波斯日期 请检查 http php net manual en intldatefor
  • PHP:如何发送电子邮件基础知识

    我想使用 PHP 从本地主机向其他人发送电子邮件 我需要做什么才能做到这一点 例如我需要安装邮件服务器吗 如果我没记错的话 有一种语言不需要邮件服务器来发送电子邮件 这样对吗 PHP ini里面有 邮件功能 如何配置这个 我在网上查了一下
  • php递归合并

    我需要以某种不同的方式合并一些数组 我使用 array merge recursive 然而 有一些事情我需要改变 但我不知道如何改变 这是来自 php net 的引用 但是 如果数组具有相同的数字键 则后面的值 不会覆盖原始值 但会追加
  • Delphi:现场记录应用程序错误

    使用 Delphi 7 我想知道是否有一个免费组件可以在我的应用程序在远程站点运行时收集诊断信息并帮助我调试错误报告 也许它会记录每个选择的菜单项 单击的控件 文本输入等 也许它只是在崩溃时转储堆栈 也许它还有其他作用 我不介意添加代码 例
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • 维护 HttpUrlConnection 调用之间的会话(Native/Webview)

    让我从我做的开始desire 我想制作一个应用程序part native and part webviews Problem 维护本机和 webview 部分之间的会话 My 处理方法 this 我打算实现一个本机登录 其中我向用户展示两个
  • PHP 中的抽象类是什么?

    PHP 中的抽象类是什么 如何使用 抽象类是至少包含一个抽象方法的类 该方法中没有任何实际代码 只有名称和参数 并且已被标记为 抽象 这样做的目的是提供一种模板来继承并强制继承类实现抽象方法 因此 抽象类是介于常规类和纯接口之间的东西 此外
  • 根据类别 woocommerce 更改同一产品的默认变体值

    我正在研究一种根据其所属类别显示同一产品的默认变体值的方法 例如 我出售一张带有蓝色和红色选项的卡 当用户进入 一 类别时 我希望默认值为蓝色 如果他属于第二类 则该值将为红色 我发现了一个钩子woocommerce product def
  • Laravel 类邮件程序不存在

    我将应用程序从 5 更新到 5 2 现在 当我调用 Mail send 时 它会返回一个异常 Class mailer 不存在 Mail send emails mail data gt content function m use to
  • 如何缓存 twitter api 结果?

    我想缓存 twitter api 结果的结果并将其显示给用户 缓存结果的最佳方法是什么 我正在考虑根据时间限制将结果写入文件 可以吗 还是应该使用任何其他方法 最重要的是 理想的缓存时间是多少 我想显示来自 twitter 的最新内容 但
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • 除括号之间的内容外,所有内容均小写

    考虑以下字符串 LoReM FOO IPSUM dolor BAR Samet fooBar 我正在寻找一种方法来小写所有内容 除了 brackets 之间的内容应该被忽略 所以期望的输出是 lorem FOO ipsum dolor BA
  • PHP 中的坏词过滤器?

    我正在用 PHP 编写一个坏词过滤器 我在数组中有一个坏词列表 方法 clean text 的写法如下 public static function cleanse text originalstring if self is sorted
  • 使用“AND”表达式构建动态 SQL,而不混淆嵌套条件?

    总的来说 我对 php 和编码相当陌生 我有一系列条件需要测试它们是否已设置 它们是 option1 option2 option3 if isset option1 if isset option2 if isset option3 qu

随机推荐

  • Pygame 如何修复“尾随像素”?

    在图像中 红色轨迹是当我在精灵周围添加边界矩形时 pygame 创建的轨迹 精灵也可以做到这一点 最简单的解决方案是在每次重绘后将表面清除为黑色 然而 尝试在整个主表面上这样做并不是一个好主意 我怎样才能解决这个问题 通常你会这样做 def
  • Java 中 for 循环转换为 while 循环

    我需要将这个 for 循环转换为 while 循环 这样我就可以避免使用中断 double array new double 100 Scanner scan new Scanner System in for int index 0 in
  • 单击 Facebook 通知后应用程序启动时,请求 ID 不可用

    Facebook 应用程序是使用 iOS 本机应用程序设置的 并使用另一个应用程序的捆绑 ID 和应用商店 ID 启用 在当前情况下 以下是可能的 1 向朋友发送应用程序请求 2 请求徽章出现在好友的Facebook中 3 单击请求将启动我
  • ftplib.error_perm: 553 无法创建文件。 (Python 2.4.4)

    我正在写入我要通过 FTP 访问的用户的主目录 因此权限应该不是问题 FTP 在 FileZilla 中运行 我检查了 vsftp conf 并做了local enable YES change On a Debian4使用 Python
  • 在 Angular2 中设置选定的属性

    我有选择组 我想为具有特定 id 的对象设置选定属性 我试图在功能上改变这种情况 但没有帮助 即使我只是简单地设置 attr selected true 这也没有帮助 div class form group div
  • 检查给定区域中是否存在包含 4 个顶点的点

    指的是http www weather gov directives sym pd01008006curr pdf 第 8 页 我们在地理坐标系 纬度和经度系统 中给出了一个具有四个顶点的区域 我想检查该区域内是否存在具有特定纬度和经度的点
  • Application Insights 如何跟踪 User_Id?

    我正在运行具有应用程序洞察力的 Azure Web 应用程序 我知道微软无法显示真实IP Client IP 所以我将真实IP地址添加到所有请求 Ip 我有一个访客 client id h9zbt 在过去 24 小时内使用 48 个不同的
  • 更新后“主页”类别页面无法使用

    版本 1 4 1 4 的 prestashop 网站正在与category php类别页面的文件 不幸的是 1 6 0 6 的更新删除了该文件 因为它已被视为已弃用 CMS 更新后 URL 结构发生变化 后果之一是 URL 结构发生变化 f
  • Rails-4 中不区分大小写的活动记录查询

    目前我正在 Rails 4 中的一个项目中工作 其中我在 example com username 上有一个用户页面 但如果我在正确的情况下使用用户名 它只会找到记录 如何在活动记录 Rails 中执行不区分大小写的搜索 看看我下面的代码
  • 当使用 Python 处理一个巨大的 CSV 并突然停止时,“killed”是什么意思?

    我有一个 Python 脚本 它导入一个大型 CSV 文件 然后计算文件中每个单词的出现次数 然后将计数导出到另一个 CSV 文件 但正在发生的事情是 一旦计数部分完成并开始导出 它就会说Killed在终端中 我不认为这是一个内存问题 如果
  • 如何从 Google Earth Engine python api 迭代并下载图像集合中的每个图像

    我是 Google Earth Engine 的新手 试图了解如何使用 Google Earth Engine python api 我可以创建一个图像集 但显然getdownloadurl 方法仅适用于单个图像 所以我试图了解如何迭代并下
  • “是”报告子进程通信错误()

    我正在使用以下函数在 Python 中运行命令 def run proc cmd child subprocess Popen cmd shell True stdout subprocess PIPE stderr subprocess
  • 使用变量值调用数组元素

    我有一个字符串变量 其中包含数组的名称 我想做的是访问该数组的一个元素 并将其写入另一个变量 我怎样才能做到这一点 var sample new Array sample 0 one sample 1 two var arrayname s
  • OpenId 与桌面应用程序?

    我们正在使用来自提供商的 API 在他们的下一个版本中 他们将提供 OpenId 服务器 但大多数用户正在使用他们的桌面应用程序 我们正在构建的另一个网站将从该应用程序打开 并且我们应该与 openid 连接以访问存储在该提供程序中的资源
  • 画布 - 移动图像问题

    我的使用画布的脚本有问题 我想移动我的图像 但使用drawImage图像移动 但结果是这样的 所以 我的代码是 function desenhaBonecoDir var ctxt document getElementById camad
  • Wix 设置中的警告

    我是 Wix 工具包的新手 我正在使用 Wix Toolkit 为我的应用程序创建一项设置 但是当我尝试使用 Wix 构建它时 它显示此警告 C Users BNK Desktop wix popup setup wxs 60 警告 LGH
  • 如何在 Windows 窗体应用程序中使用此 WndProc?

    请指导我如何使用这个WndProc在 Windows 窗体应用程序中 private IntPtr WndProc IntPtr hwnd int msg IntPtr wParam IntPtr lParam ref bool handl
  • 有 C++ 的 LINQ 库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何与平台无关 不是 CLI 的动作可以让 LINQ 以某种方式支持 C 我的意思是 世界上很大一部分服务器框架都在 UNIX 风格上运行 并
  • 对“preg_replace():未知修饰符”进行故障排除[重复]

    这个问题在这里已经有答案了 我正在尝试实现一个开源字符串到链接转换器 但我有一个错误 坦率地说我已经尝试了所有方法 但不知道出了什么问题 这是代码 chatmessage preg replace space www a zA Z0 9 a
  • Yii 中的致命错误处理

    有没有办法通过电子邮件 记录基于 Yii 框架的项目中发生的 php 致命错误 例如 可以将 Yii 配置为通过电子邮件发送 未定义变量 错误 但致命错误只能通过单独的 未集成到框架代码中的方式进行监控 这并不理想 在 php 中 可以使用