【问题标题】:PHP: How can we disable exception messages on production website and keep them in dev?PHP:我们如何在生产网站上禁用异常消息并将它们保留在开发中?
【发布时间】:2011-04-08 18:44:37
【问题描述】:

如何在生产网站上禁用异常消息并将其保留在 dev 中?

例子:

try{
  //some code
}

catch(Exception $e){
   echo $e.getMessage();
}

编辑

它在 Zend Framework 上的表现如何? (.ini 文件但是应该写的异常代码呢?)

编辑 2:

如果我的示例无法运行,zend 框架如何禁用 application.ini 中的异常消息?

resources.frontController.params.displayExceptions = 0

【问题讨论】:

    标签: php zend-framework exception exception-handling


    【解决方案1】:

    我不确定我们是否正确。

    其他答案说明如何抛出有关环境设置的异常。

    答案很简单: 应该总是抛出异常,而不是考虑环境。

    如果你需要,你可以用不同的方式处理它们,但你应该避免条件异常。

    有很多方法,你可以在你的应用中设置错误处理:

    • apache 或.htaccess config 中的ini 设置
    • 通过 php 函数使用相同的设置(例如error_reporting()
    • 配置您的前端控制器(使用application.ini 或在Bootstrap 中获取前端控制器实例)
    • 更新 ZF 的默认错误处理程序
    • 创建您自己的错误处理程序

    看起来最简单的就是application.ini

    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    resources.frontController.throwExceptions = 1
    resources.frontController.params.displayExceptions = 1
    

    application.ini 的开发部分,您可以在需要时使用零。

    我推荐使用日志应用资源来处理生产环境的异常。

    【讨论】:

    • 谢谢!但是在zend框架中resources.frontController.params.displayExceptions = 1是如何实现的呢?
    • @Yosef 只需将其放入 application.ini 即可。确保您已正确配置 [development : production] 部分和您的 APPLICATION_ENV 设置。
    • 默认已经在应用中了,请问zend是怎么实现的。
    【解决方案2】:

    我的猜测是只更改 ErrorController 和它的视图脚本。这是一些随机的error.phtml:

    <?php echo $this->message; ?>
    
    <?php if ('development' == APPLICATION_ENV): ?>
    
    <h3>Exception information:</h3>
    <p>
      <b>Message:</b> <?php echo $this->exception->getMessage() ?>
    </p>
    
    <h3>Stack trace:</h3>
    <pre><?php echo $this->exception->getTraceAsString() ?>
    </pre>
    
    <h3>Request Parameters:</h3>
    <pre><?php echo var_export($this->request->getParams(), true) ?>
    </pre>
    <?php endif ?>
    

    所以总是会显示错误消息,但有关错误本身的信息仅在 dev 上。

    【讨论】:

      【解决方案3】:

      如果您想要打印消息,您可以将代码包装在一个函数(或静态类方法)中,该函数检查 CONSTANT 的值 DEVELOPMENT|PRODUCTION

      示例:

      function printMessage($Exception) {
          if(DEV_ENVIRONMENT) {
                echo $Exception->getMessage();
           }
      }
      

      【讨论】:

        【解决方案4】:

        在这段代码中没有办法。 您必须更改代码。

        例如 make function show_error() 它在 dev 上打印错误,而在 prod 上什么也不做(只是不同的实现)。

        【讨论】:

        • 嗯,是的,这也很棒:-)
        【解决方案5】:

        我猜你的配置文件中应该有某种标志,表明安装为开发或生产。然后在 echo $e.getMessage() 之外,您可以将它传递给一个函数,如果它是开发服务器,则将其打印出来,如果它是生产服务器,则保持不变。

        【讨论】:

          猜你喜欢
          • 2018-04-11
          • 1970-01-01
          • 2014-04-19
          • 1970-01-01
          • 2013-08-13
          • 2016-08-13
          • 2018-06-04
          • 2012-03-15
          • 1970-01-01
          相关资源
          最近更新 更多