Это хороший способ для кэширования данных в PHP? - PullRequest
4 голосов
/ 03 апреля 2012

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

function get_user( $id, $flush=false ){
    static $cache;
    if ( isset($cache[$id]) && !$flush )
        return $cache[$id];
    // Do something here to get user information
    $user_info = $value;
    // Return value after storing data into cache
    return $cache[$id] = $user_info;
}

Я не совсем уверен, что это хорошая идея или, может быть, есть лучший способ сделать кеширование. Это хороший метод или нет? Если нет, то в чем недостатки?

Ответы [ 4 ]

2 голосов
/ 03 апреля 2012

Ваш код - хорошее место для запуска в том смысле, что он выполнит свою работу (более или менее - array_key_exists будет лучшим выбором, чем isset здесь, и вы не инициализируете массив явно).

Недостатки такого простого подхода станут очевидными по мере того, как вы будете развивать свой код и начнете нуждаться в большей функциональности для своего уровня кэширования. Множество проблем возникнет из-за того, что к вашему бэк-хранилищу нельзя получить доступ за пределами функции get_user. Было бы намного лучше упаковать утилиту кэширования в класс, чтобы впоследствии вы могли иметь несколько операций, которые изменяют резервное хранилище. В своей основной форме это будет выглядеть как

class Cache {
    private $store = array();

    public function get($key, $flush = false) {
        // implementation
    }
}

Дальнейшим улучшением было бы абстрагирование вашего резервного хранилища (например, в интерфейс ICacheBackingStore), чтобы вы могли подключить и настроить резервное хранилище для своего кэша динамически (множество вариантов здесь - хранение в базе данных, сериализованные файлы сеанс, memcached или аналогичный). Например:

interface ICacheBackingStore {
    function exists($key);
    function get($key);
    function set($key, $value);
    function purge($key);

    function getAllKeys();
}

class ArrayBackingStore implements ICacheBackingStore {
    private $store = array();

    public function exists($key) {
        return array_key_exists($this->store, $key);
    }

    // etc
}

class Cache {
    // you can now change/configure how the cache works through one line of code
    private $store = new ArrayBackingStore;

    public function set($key) {
        return $store->get($key);
    }
}
1 голос
/ 03 апреля 2012

посмотрите здесь . Есть несколько решений, описанных. Тип кэша зависит от того, как долго вам нужно кэшировать данные. Статические переменные не разделяются между процессами PHP и могут кэшироваться только в течение короткого времени выполнения сценария.

0 голосов
/ 03 апреля 2012

Вы можете использовать файловый кеш или memcache, apc.Zend имеет хорошую кеш-библиотеку под названием Zend_Cache, он поддерживает множество бэкэндов, таких как file, memcache, apc.Таким образом, если вы используете это, вы можете настроить кэш на основе потребностей клиента, без перекодирования.

0 голосов
/ 03 апреля 2012

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

По сути, у вас есть два варианта: «кэширование» в пределах одного запуска скрипта или более длительное кэширование.

Этот код работает только в вашей текущей сессии /файл / скрипт, поэтому его область ограничена.Если у вас есть определенные данные, которые вам нужно получить, вам, вероятно, просто нужно иметь несколько моделей, которые вы сохраняете в переменную.Вы уже должны знать, какие модели вам нужны (или вы можете узнать это во время работы вашего скрипта), и вы можете просто загрузить один раз, получить доступ несколько раз.Я не вижу необходимости в специальном «кэше только для одного скрипта / сессии»?

, с другой стороны, если вы хотите кэшировать более длительное время, несколько запросов и т. Д., Вы должны использовать что-то вроде memcached или APC.Они имеют простые в использовании методы PHP и помогают хранить вещи, которые слишком дороги для чтения из вашей базы данных

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