我有一个应用程序需要继续运行,它使用的是Yii 1.1。目前我无法将它更新到Yii 2.0。我遇到的问题是我尝试用Yii::log()
做一些调试,但它只是将log()的第一次调用写入日志文件。我无法显示确切的代码,但想法如下。
public static function foo(){
Yii::log('Entered foo()', 'dev', 'My.Code.Example');
$thing = aDataBaseQuery();
if($thing !== null){
Yii::log('foo(): thing is not null', 'dev', 'My.Code.Example');
Example::bar($thing);
}
}
public static function bar($thing){
Yii::log('Entered bar()', 'dev', 'My.Code.Example');
if($thing !== null && $thing->column_name!='none'){
Yii::log('bar(): got past first if', 'dev', 'My.Code.Example');
$thing->setAttribute("column_name","some");
$thing->save();
}
}
日志文件显示了“Entered foo()”消息,但没有显示其他消息。但我知道它一定是在bar()中输入if语句,因为预期的数据库条目的column_name被更新为“some”。所以我的问题是,是什么原因导致其他3行日志没有写入日志?
编辑:所以在我开始使用它的时候,我更困惑了。我只是在foo()中的if语句中添加了一个else,这样它就是:
public static function foo(){
Yii::log('Entered foo()', 'dev', 'My.Code.Example');
$criteria = new CDbCriteria();
$criteria->condition = "status='false'";
$thing = CActiveRecord::model()->find($criteria);
if($thing !== null){
Yii::log('foo(): thing is not null', 'dev', 'My.Code.Example');
Example::bar($thing);
} else {
Yii::log('foo(): thing is null', 'dev', 'My.Code.Example');
}
}
public static function bar($thing){
Yii::log('Entered bar()', 'dev', 'My.Code.Example');
if($thing !== null && $thing->column_name!='none'){
Yii::log('bar(): got past first if', 'dev', 'My.Code.Example');
$thing->setAttribute("column_name","some");
$thing->save();
}
}
日志显示
[dev] [My.Code.Example] Entered foo()
[dev] [My.Code.Example] foo(): thing is null
但是当我查询数据库时,条目被更新,所以column_name是一些。
1条答案
按热度按时间hl0ma9xz1#
相当有信心,我发现了这个问题。在应用程序的某个地方有一个竞争条件,导致事情变得疯狂。
编辑:问题是日志记录发生在执行完成之后。应用程序中的某个地方出现了故障,其中一个函数试图递归查询超过274,000行,形成了一个几乎无限的循环。
我的问题是,函数被调用,它已经改变了数据库条目中的一个属性,然后它被困在循环中,直到它失败,并且没有为这次运行记录日志。失败时,函数被设置为重试,此时它执行并显示它找不到数据库条目,因为它被编辑得足够多,查询不再返回该条目。