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、結果はいくつかのメソッド呼び出しと配列ルックアップになります。パフォーマンスが非常に重要な場合は、db インスタンスをキャッシュする必要があります。そうでなければ、きれいで読みやすいコードを書くことを目標にし、そのような小さな調整は気にしません。

于 2013-02-26T13:22:17.007 に答える