【问题标题】:White screen of death - no errors showing within PHP/Vagrant environment (Yii)白屏死机 - 在 PHP/Vagrant 环境 (Yii) 中没有显示错误
【发布时间】:2014-10-17 13:25:54
【问题描述】:

我不能确定这个问题是否部分是由于 vagrant,但是我在运行 Unix 的 Vagrant 机器中安装了 Yii 1.x。

我试图强制一个简单的 PHP 错误,例如控制器中缺少分号,即使我 100% 确定我创建了一个错误,但我没有看到带有堆栈跟踪的标准 Yii 错误页面。这在以前是有效的,尽管最近似乎有一些事情以这种方式阻止了这种工作。

奇怪的是 - Yii 在脚本底部输出数据库查询(这是故意的,但我不明白为什么 Yii 只显示数据库查询。

我的个人配置如下:(只显示部分..)

我已经尝试了下面的代码并检查了日志,但没有任何乐趣

ini_set('display_errors',true);
error_reporting(E_ALL);

任何人都可以提出任何想法...

return array(
'yiiDebug'      => true,
'yiiTraceLevel' => 6,
.....


'components'=>array(
   'log' => array(
   'class'  => 'CLogRouter',
   'routes' => array(
   'web'  => array(
   'class'         => 'CWebLogRoute',
   'levels'        => 'profile, trace, info, error, warning, application', // profile, trace, info, error, warning, application
                    'showInFireBug' => false
                ),
   'file' => array(
   'class'      => 'CFileLogRoute',
   'levels'     => 'error, warning, watch', // error, warning, watch
   'categories' => 'system.*',
              ),
             array(
              'class'       => 'CProfileLogRoute',
              'levels'  => 'error, warning, trace, info, profile', // error, warning, trace, info, profile
              ),
            ),
        ),
    ),

例如...在我的一个控制器中,我有以下代码:

public function actionDelete($id)
{
  $model = $this->loadModel($id);
  5e55 // added error here on purpose
}

我希望关于 5e55 的第 2 行出现错误,那里没有位置,但是我看到的不是错误,而是白屏(加上显示所有查询等的 Yii 应用程序日志) - 如果我删除 yii 配置内容以输出查询,我会得到一个 100% 的白色/空白屏幕。

我尝试在 index.php 引导文件中添加各种内容,但没有任何乐趣,我的配置看起来相对正常,但我不明白为什么错误会报告给浏览器或我的日志。

【问题讨论】:

    标签: php debugging yii error-handling vagrant


    【解决方案1】:

    你做了正确的设置

    ini_set('display_errors',true);
    error_reporting(E_ALL);
    

    ...但有几个原因可能无法真正生效。

    1) 错误报告可能会被脚本中“稍后”的内容再次关闭。因为这些设置基本上只是全局变量,任何人都可以设置它们,而且大多数框架都有它们被禁用的地方。根据您的代码“包含”的位置,链中的其他内容很可能称为 display_errors - false。

    2) 可以在运行时禁用更改设置。你的环境可能有类似 php_admin_flag 的指令来阻止 display_errors 被打开。

    如果您能够获得输出,请尝试运行此命令以转储所有 ini 设置的状态:

    var_dump(ini_get_all());
    

    但我认为可能发生的事情是您自己的文件中有一个小语法错误,而解释器完全放弃了该代码。它从未执行过,因此您的 display_errors 设置甚至没有运行。

    正如其他人建议的那样,查看您的错误日志可能会告诉您发生了什么。

    另一种 hacky 但有用的方法是尝试在命令行上执行您的文件,看看它是否给出了语法警告。我对 Yii 不熟悉,但找到你最近编辑的文件并运行:

    php -f yourproject/somefile_ofyours.php
    

    它可能会吐出这样的错误:

    PHP Parse error:  syntax error, unexpected 'xxxxx' (T_STRING) in somefile_ofyours.php on line 27
    

    【讨论】:

    • 那个命令行方法让我终于看到了标准的PHP解析错误! :) 现在只是想弄清楚为什么错误没有直接出现在浏览器中......但这越来越接近了,谢谢
    • 命令行上的 PHP 解析器会显示错误但在浏览器中查看时完全相同的页面不会显示错误的原因吗?无论哪种方式,我都越来越近了:)
    • 是的。 php 的命令行版本与作为 Web 服务器的一部分运行的设置不同(mod_php 或其他)。要么是因为它们有不同的 php.ini 文件,要么是因为 Web 版本在运行时更改了设置。
    • 谢谢 - 还没有完全找到解决方案,但是你给出的这个现在给了我一个解决方法
    • 我可以再给你一个 +100 的“php -f”吗?
    【解决方案2】:

    您是否在 php.ini 中设置了 php 错误日志文件?它包含任何东西吗? 您是否尝试通过 php 强制 yii 调试模式?

      define( 'YII_DEBUG', true );
    

    其他最重要的想法:

    • 启用错误和警告的 html 输出
    • 在 phpinfo 中看到您使用的是正确的 php.ini,并且错误报告确实是您设置的内容。
    • 检查 apache 的错误日志
    • $_SERVER['APPLICATION_ENV'] 的值是多少?

    【讨论】:

      【解决方案3】:

      首先... 您可以检查规则,允许当前用户查看错误页面

      public function accessRules()
              {
               return array(array('allow',
                                     'actions' => array('index', 'view', 'error'),
                                     'users' => array('@')),
              }
      

      还要检查一下。

      public function actionError()
             {
             if($error=Yii::app()->errorHandler->error)
             {
              if(Yii::app()->request->isAjaxRequest)
                  echo $error['message'];
              else
                  $this->render('error', $error);
             }
             }
      

      当错误被转发到 CErrorHandler 应用程序组件时,它会选择适当的视图来显示错误。 这个Link 可能会有所帮助

      protected function resolveErrorMessage($rule)
      {
      if($rule->message!==null)
      return $rule->message;
      elseif($this->message!==null)
      return $this->message;
      else
      return Yii::t('yii','You are not authorized to perform this action.');
      }
      
      • 解决了要显示的错误消息。
      • 此方法将检查 {@link message} 和 {@link CAccessRule::message} 以查看
      • 应该显示什么错误信息。
      • @param CAccessRule $rule 访问规则
      • @return 字符串错误信息

      来源:Link

      【讨论】:

        【解决方案4】:

        检查您的错误日志文件并在此处发布错误。它可能有助于解决您的问题。

        还要确保在PHP.ini 中有以下设置

        ; Report All Errors
        error_reporting = E_ALL
        
        ; Display Errors
        display_errors = On
        

        【讨论】:

          【解决方案5】:

          在这些情况下,注册关闭处理程序也很有用。

          http://php.net/manual/en/function.register-shutdown-function.php

          更多详情,

          通过 by 你可以用一个好的关闭处理程序做一些疯狂的事情:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-24
            • 2011-07-13
            • 2020-02-03
            • 2014-09-28
            • 2017-06-26
            • 1970-01-01
            • 1970-01-01
            • 2014-06-20
            相关资源
            最近更新 更多