Memcache

Memcache

Модуль Memcache предоставляет удобные процедурный и объектно-ориентированный интерфейсы к механизму кэширования memcached. Memcache это очень эффективный демон кэширования, который был специально разработан для уменьшения нагрузки на базу данных для высоконагруженных, динамичных веб-приложений.

Memcache модуль также предоставляет обработчик сессии. Более подробную информацию о Memcached можно найти на сайте memcached.org

В принципе описания установки и настройки на русском языке уже готово и с ним можно ознакомится здесь.

Имейте ввиду сохранять в кэше можно любые типы данных: и переменные, и объекты, и массивы, НО НЕ РЕСУРСЫ!

Если какой либо объект имеет в своём составе свойство - ресурс, например соединение с базой данных, или содержит другой объект имеющий подобные свойства, то эту ситуацию нужно обрабатывать отдельно, например переопределив метод __sleep() в котором этот ресурс нужно "убить" и метод __wakeup() в котором этот ресурс нужно возродить.

На самом деле все эти методы можно подразделить на 3 группы:

  1. Работа со значениями
  2. Работа с серверами и соединениями
  3. Получение информации

Работа со значениями

Методы этой группы позволяют делать следующее:

  • Устанавливать значения
  • Удалять эти значения
  • Заменять эти значения
  • Обращаться к этим значения по ключу
  • Управлять сроком жизни значений

+ пара специфичных методов для инкремента и декремента целочисленных значений.

Memcache::set()
Memcache::add()

Позволяют установить значение, задать сжатие и время жизни для этого значения. Единственное различие в поведении этих методов это то, что метод Memcache::add - вернёт FALSE, если значение с таким ключём уже установлена.

bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )

  • string $key - ключ значения, используя его мы оперируем значением.
  • mixed $var - значение.
  • int $flag - Флаг, указвающий, использовать ли сжатие (Здесь то и нужна Zlib) для сохраняемого значения, можно использовать константы
  • int $expire - Время жизни значения(кэша). Если равно нулю, то бессрочно. Вы также можете использовать метку времени или количество секунд, начиная с текущего времени, но тогда число секунд, не может превышать 2592000 (30 дней).
  <?php
  $cache = new Memcache();
  // По умолчанию используется порт 11211
  $cache->connect('localhost', 11211, 30);
  $cache->add( 'myfirst',  1000, MEMCACHE_COMPRESSED, 15 );
  $cache->set( 'mysecond', 2000, MEMCACHE_COMPRESSED, 15 );
  

Memcache::get()

Вернёт запрошенное значение или FALSE в случае неудачи, или, если значение с таким ключём ещё не установлено.

Можно передать массив ключей значений, тогда Memcache::get тоже вернёт массив, он будет содержать найденные пары ключ-значение.

Предупреждения!

Если в имени ключа присутствует обратный слэш, то результаты работы будут непредсказуемы!

Есть у Memcached и некоторые болячки: по некоторым данным, он (иногда) подвержен ошибкам переполнения буфера, который время от времени приводит к перезаписи [частичной] данных и, следовательно, делает невозможным десериализацию структур, не забудьте проверить, если в результате получения массива или объекта Memcache::get вернёт bool, dobule или long, значит что то пошло не так.

string Memcache::get ( string $key [, int &$flags ] )
array Memcache::get ( array $keys [, array &$flags ] )

  • string $key - ключ значения, или массив ключей, значения которых нужно получить.
  • int $flag - назначение этого параметра осталось для меня тайной. Я пробовал использовать некоторые целочисленные значения, но это не дало ни какого эффекта. Да и примеры в основном даны без его использования, из чего мною сделан вывод: можно прекрасно работать и без него :)
  
  <?php
  $cache = new Memcache();
  // По умолчанию используется порт 11211
  $cache->connect('localhost', 11211, 30);
  $cache->add( 'myfirst',  1000, MEMCACHE_COMPRESSED, 15 );
  $cache->set( 'mysecond', 2000, MEMCACHE_COMPRESSED, 15 );
  
  print_r( $cache->get( array('myfirst','mysecond')) );
  

Результат:

  
  Array ( [myfirst] => 1000 [mysecond] => 2000 )
  

Memcache::delete()

Удалить значение из кэша.

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Замечание:

Этот метод работает не всегда ( Зависит от версии программного обеспечения)! ЗДЕСЬ в конце страницы указаны случаи когда Memcache::delete работает, а когда нет.

Что ж, из стабильных вариантов остаётся только обнулять ненужные значения:

$cache->set( 'three', NULL );

Один только минус - ключ в этом случае ни куда не девается

string Memcache::delete ( string $key [, int $timeout = 0 ] )

  • string $key - ключ значение, которого нужно удалить.
  • int $timeout - Этот параметр так же устарел и не поддерживается, по умолчанию равен 0 секунд. Не используйте этот параметр.

Memcache::replace()

Перезаписать существующее значение.

Memcache::replace() должна использоваться, чтобы заменить существующее значение. В случае, если значение с таким ключом не существует, Memcache::replace() возвращает FALSE. В остальном Memcache::replace() ведет себя так же, как и Memcache::set(). Также можно использовать функцию memcache_replace()

string Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire ]] )

  • string $key - ключ, значение которого нужно заменить.
  • mixed $var - новое значение.
  • int $flag - Флаг, указвающий, использовать ли сжатие (Здесь то и нужна Zlib) для сохраняемого значения, можно использовать константы
  • int $expire - Время жизни значения(кэша). Если равно нулю, то бессрочно. Вы также можете использовать метку времени или количество секунд, начиная с текущего времени, но тогда число секунд, не может превышать 2592000 (30 дней).
  <?php
  $cache = new Memcache();
  // По умолчанию используется порт 11211
  $cache->connect('localhost', 11211, 30);
  $cache->add( 'one',   111, 0, 15 );
  $cache->add( 'two',   222, 0, 15 );
  $cache->add( 'three', 333, 0, 15 );
  
  $cache->replace( 'three', 777 );
  
  print_r( $cache->get( array('one','two','three')) );
  
  
  Array ( [one] => 111 [two] => 222 [three] => 777 )
  

Memcache::increment()

Увеличивает значение указанного ключа на указанное значение. Если значение указанного ключа не числовое и не может быть конвертировано в число, то оно изменит свое значение на значение, указанное как второй параметр. Memcache::increment() не создает элемент, если он еще не существует.

Здесь Не советуют использовать Memcache::increment() cо значениями, которые были сжаты (установлены с флагом MEMCACHE_COMPRESSED), потому, что потом будут "сюрпризы", когда вы попытаетесь получить эти значения при помощи Memcache::get()

Лично я проверил и ни каких глюков не заметил :)

int Memcache::increment ( string $key [, int $value = 1 ] )

  • string $key - ключ, значение которого нужно инкрементировать.
  • int $value - значение инкремента.
  <?php
  $cache = new Memcache();
  // По умолчанию используется порт 11211
  $cache->connect('localhost', 11211, 30);
  
  $cache->set( 'someOne', 10, 0, 5 );
  
  $cache->increment( 'someOne', 10, 0, 5 );
  $cache->increment( 'someOne', 10, 0, 5 );
  
  echo $cache->get('someOne');// выведет 30
  

Memcache::decrement()

Уменьшает значение указанного ключа на указанное значение. Аналогично Memcache::increment(), текущее значение элемента преобразуется в числовое и после этого уменьшается

int Memcache::decrement ( string $key [, int $value = 1 ] )

  • string $key - ключ, значение которого нужно декрементировать.
  • int $value - значение декремента.

Memcache::flush()

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

bool Memcache::flush ( void )

Пример ниже не выведет ничего.

  <?php
  $cache = new Memcache();
  // По умолчанию используется порт 11211
  $cache->connect('localhost', 11211, 30);
  
  $cache->set( 'someOne',  111, 0, 5 );
  $cache->set( 'someTwo',  222, 0, 5 );
  $cache->set( 'someTree', 333, 0, 5 );
  
  $cache->flush(); //Очистит кэш
  
  print_r( $cache->get( array('someOne','someTwo','someTree')) );
  

Работа с серверами и соединениями.

Memcache может работать, как с одним сервером, так и пулом (набором) серверов.

Если вы будете использовать только один сервер для обслуживания кэша, то для инициализации работы Вам будет достаточно создать объект кэша, и использовать метод Memcache::connect

Если вы собираетесь формировать пул серверов, то тут потребуется сначала создать объект кэша, а потом методом Memcache::addServer добавить в него требуемое количество серверов.

Memcache::connect()

Устанавливает соединение с сервером Memcached. Соединение, которое было открыто с помощью Memcache::connect() будет автоматически закрыто по завершению скрипта, но Вы можете закрыть его явно используя Memcache::close(). Также вы можете использовать функцию memcache_connect ().Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )

  • string $host - Хост Memcached. Этот параметр может также указать другие транспорты, как unix:///path/to/memcached.sock т.е. использовать UNIX сокеты, в этом случае порт должен быть установлен в 0.
  • int $port - порт, на котором Memcached слушает соединения. Установите этот параметр в 0, если предполагается использование сокетов.
  • int $timeout - Лимит в секундах, для подключения к демону. Подумайте дважды, прежде чем изменять значение по умолчанию 1 секунда - вы можете потерять все преимущества кэширования, если ваше соединение будет происходить слишком долго.
  <?php
  $cache = new Memcache();
  $cache->connect('localhost', 11211, 30);
	

Memcache::pconnect()

Этот метод похож на Memcache::connect() с той лишь разницей, что он устанавливает постоянное соединение. Это соединение не закрывается по окончанию выполнения скрипта и вызовом Memcache::close(). Также вы можете использовать функцию memcache_pconnect().Возвращает Memcache object в случае успешного завершения или FALSE в случае возникновения ошибки.

mixed Memcache::pconnect ( string $host [, int $port [, int $timeout ]] )

  • string $host - Хост Memcached. Этот параметр может также указать другие транспорты, как unix:///path/to/memcached.sock т.е. использовать UNIX сокеты, в этом случае порт должен быть установлен в 0.
  • int $port - порт, на котором Memcached слушает соединения. Установите этот параметр в 0, если предполагается использование сокетов.
  • int $timeout - Лимит в секундах, для подключения к демону. Подумайте дважды, прежде чем изменять значение по умолчанию 1 секунда - вы можете потерять все преимущества кэширования, если ваше соединение будет происходить слишком долго.
  <?php
  $cache = new Memcache();
  $cache->pconnect('localhost', 11211, 30);
	

Memcache::close()

Закрывает соединение с сервером Memcached. Эта функция не закрывает постоянные соединения, которые закрываются только во время выключения/перезагрузки веб-сервера. Также можно использовать функцию memcache_close().

bool Memcache::close ( void )

Memcache::addServer()

Добавляет сервер в пул соединений. Соединение, которое было открыто с помощью Memcache::addServer() будет автоматически закрыто по завершению скрипта, так же вы можете закрыть его вручную с Memcache::close(). Можно использовать функцию memcache_add_server()

При использовании Memcache::addServer (в отличие от Memcache::connect() и Memcache::PConnect()) сетевое соединение не установается, пока оно на самом деле не потребуется. Таким образом, нет накладных расходов при добавлении большого количества серверов в пул, даже если они и не потребуются вовсе.

Пул серверов обеспечивает более высокую отказоустойчивость. Любые ошибки сокетов, или ошибки Memcached на уровне сервера (кроме ошибок памяти) вызвают перераспределение ресурсов. Такие ошибки клиента, как добавление существующего ключа не вызовет сбоев.

Замечание:

Эта функция была добавлена в Memcache в версии 2.0.0

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

bool Memcache::addServer ( string $host [, int $port = 11211 [, bool $persistent [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callable $failure_callback [, int $timeoutms ]]]]]]]] )

  • string $host - Хост Memcached. Этот параметр может также указать другие транспорты, как unix:///path/to/memcached.sock т.е. использовать UNIX сокеты, в этом случае порт должен быть установлен в 0.
  • int $port - порт, на котором Memcached слушает соединения. Установите этот параметр в 0, если предполагается использование сокетов.
  • bool $persistent - Устанавливает использование постоянного соединения. По умолчанию в значение TRUE.
  • int $weight - Чем больше, тем вероятнее, что данный сервер будет выбран для хранения значений. Т.е. это своеобразный "вес" сервера в общем пуле, косвенно это ещё и предполагаемая нагрузка на сервер.
  • int $timeout - Лимит в секундах, для подключения к демону. Подумайте дважды, прежде чем изменять значение по умолчанию 1 секунда - вы можете потерять все преимущества кэширования, если ваше соединение будет происходить слишком долго.
  • int $retry_interval - Устанавливает, как часто отказавший сервер будет опрашиваться, значение по умолчанию составляет 15 секунд. Установка этого параметра в -1 отключает автоматический повтор запросов.
  • bool $status - Помечает сервер как ONLINE. Установка этого параметра в FALSE и retry_interval -1 позволяет отказавшему серверу хранится в пуле активных серверов, чтобы не влиять на ключевые алгоритмы распределения. Обращения к этому серверу будут распределятся между оставшимися доступными серверами. По умолчанию значение TRUE, то есть сервер должен рассматриваться как ONLINE.
  • callable $failure_callback - Позволяет пользователю указать функцию обратного вызова для запуска при обнаружении ошибки. Функция должна принимать два параметра, имя хоста и порт вышедшего из строя сервера.
  • string $timeoutms - не описана.

Получение информации

Memcache::getExtendedStats()

Возвращает двумерный, ассоциативный массив статистики серверов. Массив ключей типа "хост:порт" сервера. Значения содержат отдельные параметры статистики. Отказавшие сервера будет иметь значение FALSE. Вы также можете использовать функцию memcache_get_extended_stats()

Замечание:

Эта функция была добавлена в Memcache в версии 2.0.0

array Memcache::getExtendedStats ([ string $type [, int $slabid [, int $limit = 100 ]]] )

  • string $type - Тип статистики. Допустимые значения: {reset, malloc, maps, cachedump, slabs, items, sizes}. Согласно спецификации протокола Memcached эти дополнительные аргументы "могут быть изменены для удобства разработчиков".
  • int $slabid - Используется, когда первый параметр установлен в "cachedump" определяет сервер, который будет использоваться для отладки.
  • int $limit - Используется, когда первый параметр установлен в "cachedump" ограничивает количество записей в дамп.

А теперь прикол:

Тип статистики "cachedump" был удален из Memcached по соображениям безопасности

Пример вывода информации (вызов без параметров) :

  Array
  (
      [localhost:11211] => Array
          (
              [pid] => 5179
              [uptime] => 966862
              [time] => 1336505233
              [version] => 1.4.5
              [pointer_size] => 64
              [rusage_user] => 160.302880
              [rusage_system] => 483.975109
              [curr_connections] => 6
              [total_connections] => 358080
              [connection_structures] => 13
              [cmd_get] => 15037476
              [cmd_set] => 3501979
              [cmd_flush] => 46
              [get_hits] => 11507898
              [get_misses] => 3529578
              [delete_misses] => 0
              [delete_hits] => 0
              [incr_misses] => 0
              [incr_hits] => 76
              [decr_misses] => 0
              [decr_hits] => 0
              [cas_misses] => 0
              [cas_hits] => 0
              [cas_badval] => 0
              [auth_cmds] => 0
              [auth_errors] => 0
              [bytes_read] => 1643906080
              [bytes_written] => 11298732744
              [limit_maxbytes] => 67108864
              [accepting_conns] => 1
              [listen_disabled_num] => 0
              [threads] => 4
              [conn_yields] => 0
              [bytes] => 3295454
              [curr_items] => 7623
              [total_items] => 3501915
              [evictions] => 0
              [reclaimed] => 1825755
          )
      ...
  )

Memcache::getServerStatus()

Возвращает статус сервера "онлайн/оффлайн". Можно также использовать функцию memcache_get_server_status()

Замечание:

Эта функция была добавлена в Memcache в версии 2.0.0

int Memcache::getServerStatus ( string $host [, int $port = 11211 ] )

  • string $host - Хост Memcached.
  • int $port - порт, на котором Memcached слушает соединения.

Memcache::getStats()

Возвращает ассоциативный массив со статистикой сервера. Массив ключей соответствуют статистике параметры и значения для значения параметра. Также можно использовать функцию memcache_get_stats()

array Memcache::getStatss ([ string $type [, int $slabid [, int $limit = 100 ]]] )

  • string $type - Тип статистики. Допустимые значения: {reset, malloc, maps, cachedump, slabs, items, sizes}. Согласно спецификации протокола Memcached эти дополнительные аргументы "могут быть изменены для удобства разработчиков".
  • int $slabid - Используется, когда первый параметр установлен в "cachedump" определяет сервер, который будет использоваться для отладки.
  • int $limit - Используется, когда первый параметр установлен в "cachedump" ограничивает количество записей в дамп.

Memcache::getVersion()

Возвращает строку - номер версии сервера. Также вы можете использовать функцию memcache_get_version().

string Memcache::getVersion ( void )

Memcache::setCompressThreshold()

Обеспечивает автоматическое сжатие больших значений. Вы также можете использовать функцию memcache_set_compress_threshold()

Замечание:

Эта функция была добавлена в Memcache в версии 2.0.0

bool Memcache::setCompressThreshold ( int $threshold [, float $min_savings ] )

  • int $threshold - Минимальная длина значения, которое требуется сжимать автоматически.
  • float $min_savings - Задает коэфициент сжатия. Указанное значение должно быть между 0 и 1. Значение по умолчанию составляет 0,2 дает минимум 20% экономии сжатия.

Memcache::setServerParams()

Изменяет параметры сервера прямо во время выполнения. Вы также можете использовать функцию memcache_set_server_params().

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Замечание:

Эта функция была добавлена в Memcache в версии 2.0.0

bool Memcache::setServerParams ( string $host [, int $port = 11211 [, int $timeout [, int $retry_interval = false [, bool $status [, callable $failure_callback ]]]]] )

  • string $host - Хост Memcached.
  • int $port - порт, на котором Memcached слушает соединения.
  • int $timeout - Лимит в секундах, для подключения к демону. Подумайте дважды, прежде чем изменять значение по умолчанию 1 секунда - вы можете потерять все преимущества кэширования, если ваше соединение будет происходить слишком долго.
  • int $retry_interval - Устанавливает, как часто отказавший сервер будет опрашиваться, значение по умолчанию составляет 15 секунд. Установка этого параметра в -1 отключает автоматический повтор запросов.
  • bool $status - Помечает сервер как ONLINE. Установка этого параметра в FALSE и retry_interval -1 позволяет отказавшему серверу хранится в пуле активных серверов, чтобы не влиять на ключевые алгоритмы распределения. Обращения к этому серверу будут распределятся между оставшимися доступными серверами. По умолчанию значение TRUE, то есть сервер должен рассматриваться как ONLINE.
  • callable $failure_callback - Позволяет пользователю указать функцию обратного вызова для запуска при обнаружении ошибки. Функция должна принимать два параметра, имя хоста и порт вышедшего из строя сервера.

Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 35 гостей онлайн