Где создать новый Memcache в php mvc - PullRequest
0 голосов
/ 09 февраля 2012

Я пытаюсь, чтобы мое кэширование работало правильно, чтобы мне не нужно было создавать новый экземпляр memcache каждый раз, когда я хочу кэшировать запрос в функции модели:

class contentModel {

    function getData() {

        $core = Connect::getInstance();

        $memcache = new Memcache;
        $memcache->connect('localhost', 11211) or die ("Could not connect");

        $data = $memcache->get("query".$sql);

        if($!data)
            // get data

        return $data;
    }
}

Еслив моем корневом index.php я добавляю:

global $memcache;
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

Тогда я смогу просто вызывать $memcache->get($key) во всех классах без необходимости повторять его экземпляр?

Или есть другой способЯ должен пойти об упрощении этого?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Вы можете сделать $memcached статическим членом базового класса вашей модели, например:

class Model {
    protected static $memcached;

    public static function setMemcached(Memcached $mc) {
        self::$memcached = $mc;
    }
}

class User extends Model {
    public function getData() {
        parent::$memcached->get("...");
    }
}

// In index.php
Model::setMemcached(new Memcached("127.0.0.1:11211"));
0 голосов
/ 09 февраля 2012

Как правило, вы должны думать, что доступ к данным кэша (опять же) - доступ к данным, и это ответственность, которую должны обрабатывать ваши объекты доступа к данным (или модели, или как вы хотите их называть).

Потому что, если нет, что ты собираешься делать? предоставлять доступ к memcached из представления вообще не имеет смысла, а контроллеры? контроллеры должны позаботиться об управлении информацией формы и т. д., поскольку контроллер не должен обращаться к базе данных, он также не должен обращаться к memcached.

Наконец, если вы управляете своей memcached на моделях / daos, у вас есть ЕДИНСТВЕННАЯ точка записи / чтения в / из memcached, так что вы можете с уверенностью знать, что информация из кэша всегда отражает информацию из базы данных. Также это будет полностью прозрачно для разработчика (особенно полезно для средних и больших команд). Кроме того, имея централизованное (опять же, модель / дао) место для доступа к memcached, вы избежите, чтобы разные ключи хранили одно и то же значение, поэтому вы сэкономите память и сможете кешировать больше информации.

0 голосов
/ 09 февраля 2012

Разве кэширование не будет лучше реализовано в библиотеке доступа к базе данных / данным, а затем будет вызываться при необходимости для определенных запросов / запросов данных?Таким образом, фактический механизм, используемый для выполнения кэширования, будет прозрачен для моделей.

Вам потребуется поддерживать только один экземпляр в библиотеке базы данных, который будет использоваться совместно.Было бы снижение производительности, чтобы проверить, использовать ли кэширование или нет, но это относительно дешево по сравнению с повышенной сложностью во всех ваших моделях.

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