2

如果我必须连续执行多个查询,这样做是否更好:

$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
}

?

4

1 回答 1

2

您可以跟踪源代码以查看调用时会发生什么Yii::app()->db

Yii::app()返回 的静态app属性YiiBase您可以在此处查看源代码。

public static function app()
{
    return self::$_app;
}

Yii::app()->db这里变得更有趣了,因为有些东西被查到了。您可以在此处查看源代码。

public function getDb()
{
    return $this->getComponent('db');
}

getComponent()是你在这里CModule找到源代码的一种方法。

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,会产生一些方法调用和数组查找。如果性能非常关键,您可能应该缓存数据库实例。否则,我的目标是编写干净易读的代码,而不会关心这样的小调整。

于 2013-02-26T13:22:17.007 回答