白色死亡屏幕 - 在PHP / Vagrant环境中没有显示错误(Yii)

时间:2014-10-17 13:25:54

标签: php debugging yii error-handling 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
}

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

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

5 个答案:

答案 0 :(得分:5)

您已通过设置

做了正确的事情
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

答案 1 :(得分:1)

你在php.ini中设置了php错误日志文件吗?它包含什么吗? 你有没有尝试通过PHP强制yii调试模式?

  define( 'YII_DEBUG', true );

其他最重要的想法:

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

答案 2 :(得分:1)

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

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 $规则访问规则
  • @return string错误消息

来源:Link

答案 3 :(得分:0)

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

另外,请务必在PHP.ini

中进行以下设置
; Report All Errors
error_reporting = E_ALL

; Display Errors
display_errors = On

答案 4 :(得分:0)

在这些情况下注册关机处理程序也会带来很大好处。

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

了解更多详情,

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