gpt4 book ai didi

php - Zend 框架 - PHP fatal error 的错误页面

转载 作者:行者123 更新时间:2023-12-03 07:47:53 26 4
gpt4 key购买 nike

在使用 Zend 1 框架的 PHP webapp 上,如果代码抛出异常,我会得到一个带有我的品牌等的漂亮错误页面。

如果代码遇到 PHP fatal error (例如,当对象引用意外为空时,“方法调用非对象”),那么我只会得到一个 Apache 500 错误页面。

在后一种情况下,如何获得一个不错的错误页面?

我尝试过的事情:

  • 如果设置了 PHP ini "display_errors",那么我只会收到纯文本形式的 fatal error 消息
  • 如果未设置“display_errors”,则会得到 Apache 默认 500 错误页面
  • 在这种情况下,Apache“ErrorDocument”指令似乎被忽略了
  • 最佳答案

    如果这可以帮助任何人,我可以通过一些技巧获得完整的 Zend 错误页面(带有应用程序布局),以在出现 fatal error 的情况下显示。

    希望有一个更简单的方法来做到这一点。如果是这样,请在您的替代方案中添加答案。

    将此添加到 Bootstrap :

      /**
    * Sets up a register_shutdown_function hook to give a nice error page when a
    * PHP fatal error is encountered.
    */
    protected function _initFatalErrorCatcher()
    {
    register_shutdown_function(array($this, 'onApplicationShutdown'));
    }

    public function onApplicationShutdown()
    {
    $error = error_get_last();
    $wasFatal = ($error && ($error['type'] === E_ERROR) || ($error['type'] === E_USER_ERROR));
    if ($wasFatal)
    {
    $frontController = Zend_Controller_Front::getInstance();
    $errorHandler = $frontController->getPlugin('Zend_Controller_Plugin_ErrorHandler');
    $request = $frontController->getRequest();
    $response = $frontController->getResponse();

    // Add the fatal exception to the response in a format that ErrorHandler will understand
    $response->setException(new Exception(
    "Fatal error: $error[message] at $error[file]:$error[line]",
    $error['type']));

    // Call ErrorHandler->_handleError which will forward to the Error controller
    $handleErrorMethod = new ReflectionMethod('Zend_Controller_Plugin_ErrorHandler', '_handleError');
    $handleErrorMethod->setAccessible(true);
    $handleErrorMethod->invoke($errorHandler, $request);

    // Discard any view output from before the fatal
    ob_end_clean();

    // Now display the error controller:
    $frontController->dispatch($request, $response);
    }
    }

    您需要一个自定义路由器类来帮助:
    class My_Router_Rewrite extends Zend_Controller_Router_Rewrite
    {
    public function route(Zend_Controller_Request_Abstract $request)
    {
    // If the ErrorHandler plugin has stashed the error in a request param, then
    // it will have already dealt with routing (see Bootstrap::onApplicationShutdown())
    // (Note that this param cannot be spoofed, since any user-supplied params
    // will be strings, not objects)
    if (is_object($request->getParam('error_handler'))) {
    return $request;
    } else {
    return parent::route($request);
    }
    }
    }

    (确保此类在 Bootstrap 中注册为您的路由器)

    关于php - Zend 框架 - PHP fatal error 的错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16284235/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com