死亡白屏-PHP/Vagrant环境(Yii)内无错误显示
我不能确定这个问题是否部分是由vagrant造成的,但是我在运行Unix的vagrant box中安装了一个Yii 1.x 我试图强制执行一个简单的PHP错误,例如控制器中缺少分号,尽管我100%确定我创建了一个错误,但我没有看到带有堆栈跟踪的标准Yii错误页面。这在以前是有效的,尽管最近的一些事情似乎以这种方式停止了这项工作 奇怪的是-Yii在脚本的底部输出数据库查询(这是有意的,但我无法理解为什么Yii只显示DB查询) 我的个人配置如下所示:(仅显示部分内容) 我尝试了下面的代码&检查日志,但没有乐趣死亡白屏-PHP/Vagrant环境(Yii)内无错误显示,php,debugging,yii,error-handling,vagrant,Php,Debugging,Yii,Error Handling,Vagrant,我不能确定这个问题是否部分是由vagrant造成的,但是我在运行Unix的vagrant box中安装了一个Yii 1.x 我试图强制执行一个简单的PHP错误,例如控制器中缺少分号,尽管我100%确定我创建了一个错误,但我没有看到带有堆栈跟踪的标准Yii错误页面。这在以前是有效的,尽管最近的一些事情似乎以这种方式停止了这项工作 奇怪的是-Yii在脚本的底部输出数据库查询(这是有意的,但我无法理解为什么Yii只显示DB查询) 我的个人配置如下所示:(仅显示部分内容) 我尝试了下面的代码&检查日志,
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会出现一个错误,但我看到的不是错误,而是一个白色屏幕(加上显示所有查询的Yii应用程序日志等)-如果我删除Yii配置以输出查询,我会得到一个100%的白色/空白屏幕
我曾尝试向index.php引导文件添加各种内容,但没有任何乐趣,我的配置看起来相对正常,但我无法理解为什么会向浏览器或日志报告错误。检查错误日志文件并在此处发布错误。这可能有助于解决您的问题 还要确保在
PHP.ini中有以下设置
; Report All Errors
error_reporting = E_ALL
; Display Errors
display_errors = On
您是否在php.ini中设置了php错误日志文件?它是否包含任何内容?
您是否尝试通过php强制使用yii调试模式
define( 'YII_DEBUG', true );
其他最重要的想法:
- 启用错误和警告的html输出
- 在phpinfo中可以看到您使用的是正确的php.ini,并且错误报告是您设置的
- 检查apache的错误日志
$\u SERVER['APPLICATION\u ENV']
的值是多少
通过设置
ini_set('display_errors',true);
error_reporting(E_ALL);
…但有几个原因说明这可能不会真正生效
1) 脚本中的“稍后”内容可能会再次关闭错误报告。因为这些设置基本上只是全局变量,任何人都可以设置它们,而且大多数框架都有禁用它们的地方。根据代码“包含”的位置,链中的其他内容可能会称为display_errors-false
2) 可以在运行时禁用更改设置。您的环境可能有类似php_admin_标志的指令,用于停止打开显示错误
如果您能够获得任何输出,请尝试运行此命令以转储所有ini设置的状态:
var_dump(ini_get_all());
但我认为可能发生的是,您自己的一个文件中有一个小语法错误,而解释器完全放弃了该代码。它从未执行过,因此您的“显示错误”设置甚至无法运行
正如其他人所建议的,查看错误日志可能会告诉您发生了什么
另一个有技巧但有用的方法是尝试在命令行上执行文件,看看它是否给出语法警告。我不熟悉Yii,但找到您最近编辑的文件并运行以下操作:
php -f yourproject/somefile_ofyours.php
它可能会抛出如下错误:
PHP Parse error: syntax error, unexpected 'xxxxx' (T_STRING) in somefile_ofyours.php on line 27
首先。。。
您可以检查规则,确保允许当前用户查看错误页面
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应用程序组件时,它会选择适当的视图来显示错误。
这可能会有帮助
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访问规则
- @返回错误消息的字符串
来源:在这些情况下,注册关机处理程序也会有很大的好处
看
欲知详情,
顺便说一句,你可以用一个好的关机处理程序做一些疯狂的事情:)这个命令行方法让我终于看到了标准的PHP解析错误:)现在,我想知道为什么错误不会直接出现在浏览器中。。。。但是这一点越来越接近了,为什么命令行上的PHP解析器会显示错误,但在浏览器中查看完全相同的页面时却不会显示??不管怎样,我都越来越近了:)是的。php的cmd行版本与作为web服务器一部分运行的版本(mod_php或其他)有不同的设置。要么是因为它们有不同的php.ini文件,要么是因为web版本在运行时更改了设置。谢谢-还没有找到解决方案,但您提供的解决方案为我提供了一个暂时的解决方案。我可以为“php-f”再提供+100吗?