Spec-Zone .ru
спецификации, руководства, описания, API

15.6.3.6. Используя MySQL и memcached с PHP

PHP оказывает поддержку для функций Memcache посредством расширения PECL. Включать PHP memcache расширения, создайте PHP использование --enable-memcache опция, чтобы сконфигурировать, создавая из источника.

Если Вы устанавливаете на основанном на Red Hat сервере, можно установить php-pecl-memcache ОБ/МИН:

root-shell> yum --install php-pecl-memcache

На Debian-на-основе дистрибутивах используйте php-memcache пакет.

Чтобы установить глобальные параметры конфигурации времени выполнения, определите значения параметра конфигурации в пределах Вашего php.ini файл. Следующая таблица обеспечивает имя, значение по умолчанию, и описание для каждого глобального параметра конфигурации времени выполнения.

Параметр конфигурации Значение по умолчанию Описание
memcache.allow_failover 1 Определяет, должен ли другой сервер в списке быть запрошен если первый сервер выбранные сбои.
memcache.max_failover_attempts 20 Определяет число серверов, чтобы попробовать прежде, чем возвратить отказ.
memcache.chunk_size 8192 Определяет размер сетевых блоков, используемых, чтобы обмениваться данными с memcached сервером.
memcache.default_port 11211 Определяет порт значения по умолчанию, чтобы использовать, связываясь с memcached серверами.
memcache.hash_strategy стандарт Определяет который стратегия хеша использовать. Набор к consistent позволять серверам быть добавленными или удаленными из пула, не заставляя ключи быть повторно отображенным на другие серверы. Когда установлено в standard, более старая (modula) стратегия используется, который потенциально использует различные серверы для хранения.
memcache.hash_function crc32 Определяет который функция использовать, отображая ключи на серверы. crc32 использует стандартный хеш CRC32. fnv использует FNV-1a hashingalgorithm.

Чтобы создать соединение с memcached сервером, создайте новое Memcache возразите и затем определите опции соединения. Например:

<?php$cache = new Memcache;$cache->connect('localhost',11211);?>

Это открывает непосредственное соединение с указанным сервером.

Чтобы использовать многократные memcached серверы, Вы должны добавить серверы к использованию объекта memcache addServer():

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

Механизм управления сервером в пределах php-memcache модуль является критической частью интерфейса, поскольку это управляет основным интерфейсом к memcached экземплярам и как различные экземпляры выбираются через хеширующий механизм.

Создать простое соединение с двумя memcached экземплярами:

<?php$cache = new Memcache;$cache->addServer('192.168.0.100',11211);$cache->addServer('192.168.0.101',11211);?>

В этом сценарии соединение экземпляра явно не открывается, но только открывается, когда Вы пытаетесь сохранить или получить значение. Чтобы включить персистентным соединениям с memcached экземплярами, установите $persistent параметр истине. Это - настройка по умолчанию, и заставляет соединения оставаться открытыми.

Чтобы помочь управлять распределением ключей к различным экземплярам, используйте глобальную переменную memcache.hash_strategy установка. Это устанавливает хеширующий механизм, используемый, чтобы выбрать. Можно также добавить другой вес к каждому серверу, который эффективно увеличивает число раз, запись экземпляра появляется в списке экземпляра, поэтому увеличивая вероятность экземпляра, предпочитаемого другим экземплярам. Чтобы установить вес, установите значение $weight параметр больше чем одному.

Функции для установки и получения информации идентичны универсальному функциональному интерфейсу, предлагаемому memcached, как показано в этой таблице:

PECL memcache Функция Родовая функция
get() Универсальный get().
set() Универсальный set().
add() Универсальный add().
replace() Универсальный replace().
delete() Универсальный delete().
increment() Универсальный incr().
decrement() Универсальный decr().

Полный пример PECL memcache интерфейс обеспечивается ниже. Код загружает пленочные данные из базы данных Sakila, когда пользователь обеспечивает пленочное имя. Данные, хранившие в memcached экземпляр записывается как a mysqli строка результата, и API автоматически сериализируют информацию для Вас.

<?php$memc = new Memcache;$memc->addServer('localhost','11211');if(empty($_POST['film'])) {?>  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">    <head>      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />      <title>Simple Memcache Lookup</title>    </head>    <body>      <form method="post">        <p><b>Film</b>: <input type="text" size="20" name="film"></p>        <input type="submit">      </form>      <hr/><?php} else {        echo "Loading data...\n";        $film   = htmlspecialchars($_POST['film'], ENT_QUOTES, 'UTF-8');    $mfilms = $memc->get($film);    if ($mfilms) {        printf("<p>Film data for %s loaded from memcache</p>", $mfilms['title']);        foreach (array_keys($mfilms) as $key) {            printf("<p><b>%s</b>: %s</p>", $key, $mfilms[$key]);        }    } else {        $mysqli = mysqli('localhost','sakila','password','sakila');            if (mysqli_connect_error()) {            sprintf("Database error: (%d) %s", mysqli_connect_errno(), mysqli_connect_error());            exit;        }            $sql = sprintf('SELECT * FROM film WHERE title="%s"', $mysqli->real_escape_string($film));        $result = $mysqli->query($sql);        if (!$result) {            sprintf("Database error: (%d) %s", $mysqli->errno, $mysqli->error);            exit;        }        $row = $result->fetch_assoc();        $memc->set($row['title'], $row);        printf("<p>Loaded (%s) from MySQL</p>", htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');    }}?>  </body></html>

С PHP соединения с memcached экземплярами сохраняются открытыми, пока PHP и связанный экземпляр Apache остаются работать. Добавляя или удаляя серверы из списка в рабочем экземпляре (например, запуская другой сценарий, который упоминает дополнительные серверы), соединения совместно используются, но сценарий только выбирает среди экземпляров, явно сконфигурированных в пределах сценария.

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