如果我必须连续执行多个查询,这样做是否更好:
$connection = Yii::app()->db;
一次...然后继续使用 $connection,或者如果我有多个这样的函数,是否会有开销:
function mainFunction() {
$dbResult1 = dbresult1();
$dbResult2 = dbresult2();
$dbResult2 = dbresult3();
}
function dbresult1() {
$connection = Yii::app()->db;
// do stuff
return $result;
}
function dbresult2() {
$connection = Yii::app()->db;
// do stuff
return $result;
}
function dbresult3() {
$connection = Yii::app()->db;
// do stuff
return $result;
}
这样做会更好吗:
function mainFunction() {
$connection = Yii::app()->db;
// do stuff with $connection for $dbResult1
// do stuff with $connection for $dbResult2
// do stuff with $connection for $dbResult3
}
?
最佳答案
您可以跟踪源代码以查看调用 Yii::app()->db
时会发生什么:
Yii::app()
返回 YiiBase
的静态 app
属性。可以看源码here .
public static function app()
{
return self::$_app;
}
Yii::app()->db
这里变得更有趣了,因为有些东西被查找了。可以看源码here .
public function getDb()
{
return $this->getComponent('db');
}
getComponent()
是CModule
的一个方法,你可以找到源代码here .
public function getComponent($id,$createIfNull=true)
{
if(isset($this->_components[$id]))
return $this->_components[$id];
elseif(isset($this->_componentConfig[$id]) && $createIfNull)
{
$config=$this->_componentConfig[$id];
if(!isset($config['enabled']) || $config['enabled'])
{
Yii::trace("Loading \"$id\" application component",'system.CModule');
unset($config['enabled']);
$component=Yii::createComponent($config);
$component->init();
return $this->_components[$id]=$component;
}
}
}
如您所见,Yii::app()->db
导致了一些方法调用和数组查找。如果性能非常关键,您可能应该缓存数据库实例。否则我会专注于编写干净且可读的代码,而不会关心这样的小调整。
关于yii - 多次使用 Yii::app()->db 的开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15088664/