Как реализовать Memcached с помощью PDO - PullRequest
2 голосов
/ 07 декабря 2010

Нужно ли изменять каждый запрос в моем приложении, чтобы использовать Memcached?

Я использую этот класс БД из учебника по PDO:

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?

1 Ответ

3 голосов
/ 07 декабря 2010

во-первых, я бы перестроил ваш класс так, чтобы расширить класс 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, с execute.

Каждый метод, который возвращает набор результатов, которые вы бы отправили md5-запросу для создания уникального хеша для этого запроса, затем вы проверили бы, существует ли он в кеше, если да, то вы вернетесь вместо этого, в противном случае просто запустите новый запрос, извлекающий результаты, а затем, прежде чем их вернуть, сохраните их в кеше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...