2010-12-07 10 views
2

Memcachedを使用するには、アプリケーション内のすべてのクエリを1つずつ変更する必要がありますか?MemcachedをPDOで実装する方法

私はPDOのチュートリアルからこのDBクラスを使用しています:

class DB { 

private static $host; 
private static $dbName; 
private static $user; 
private static $password; 

/*** Declare instance ***/ 
private static $instance = NULL; 

/** 
* 
* the constructor is set to private so 
* so nobody can create a new instance using new 
* 
*/ 
private function __construct() {} 

/** 
* 
* Return DB instance or create intitial connection 
* @return object (PDO) 
* @access public 
* 
*/ 
public static function getInstance() { 

    if (!self::$instance){ 
     self::$instance = new PDO("mysql:host=".self::$host.";dbname=".self::$dbName, self::$user, self::$password); 
     self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    return self::$instance; 
} 

/** 
* 
* Like the constructor, we make __clone private 
* so nobody can clone the instance 
* 
*/ 
private function __clone(){} 

} /*** end of class ***/ 

は、Memcachedのを組み込むために、それを修正するのすてきな簡単な方法はありますか?

+0

[私はPDOとmemcachedを使ってキャッシュシステムを設計する方法は?](http://stackoverflow.com/questions)/2600720/how-i-can-design-a-cache-system-using-pdo-and-memcached) – RobertPitt

+0

@Robert私はその質問とそのリンクを読んでいます。 – bcmcfc

答えて

3

まず、私はそうのようなPDOクラスを拡張するクラスの構造を再なります実行して

class Database extends PDO 
{ 
    /** 
    * 
    * the constructor is set to private so 
    * so nobody can create a new instance using new 
    * 
    */ 
    private static $Instance; 
    public $Cache = null; 

    public function Instance() 
    { 
     if(self::$Instance === null) 
     { 
      self::$Instance = new Database; 
      self::$Instance->Cache = new Memcached; 
     } 
     return self::$Instance; 
    } 

    public function __construct() 
    { 
     parent::__construct("Connection;String"); 
     $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array(&$this))); 
    } 
} 

class DBStatement extends PDOStatement 
{ 
    public $db; 

    protected function __construct(&$db) 
    { 
     $this->db =& $db; 
    } 
    /* 
     * PDO Methods! 
    */ 

    public function rowCount() 
    { 
        return $this->foundRows; 
    } 

     public function execute($array = null) 
    { 
         if ($array === null) 
         { 
             $result = parent::execute(); 
         }else 
     { 
            $result = parent :: execute($array); 
        } 
     return $result; 
    } 
} 

その後の方法は、上記のクラスDBStatementに例として上書きされます。

結果のセットを返す各メソッドでは、そのクエリの一意のハッシュを作成するためにクエリをmd5すると、キャッシュにキャッシュされているかどうかを確認します。結果をフェッチして新しいクエリを実行し、キャッシュに戻す前にキャッシュに格納してください。

+0

あなたの答えをありがとう。私は別のrowCount関数が必要な理由、またはPDO文にキャッシングを適切に統合する方法を知りません。 PDO StatementオブジェクトはPDOによって返されるため、キャッシュの内容はStatementではなくPDOを拡張するクラスにある必要はありませんか? – bcmcfc

+1

PODStatementがPDO Mainによって返されたとしても、キャッシュされたバージョンのデータをチェックする必要があるときに、文でexecuteを実行すると、サーバに対してまだ実行されません。 – RobertPitt

関連する問題