Jump to content
Sign in to follow this  
kphp

Эмулятор Memcache для обычного хостинга

Recommended Posts

Автор OTTO https://github.com/OTTO11/memcache

README.md
Эмулятор Memcache для обычного хостинга
Описание - все закешированные данные хранятся в файлах в json формате.

Установка
Методы
Memcache::connect — Открывает соединение с memcached сервером
Memcache::pconnect — Открывает постоянное соединение с memcached сервером
Memcache::addServer — Добавить memcached сервер в пул соединений
Memcache::add — Добавить значение
Memcache::set — Установить значение
Memcache::replace — Заменить значение
Memcache::get — Получить значение
Memcache::increment — Инкрементирует значение
Memcache::decrement — Декрементирует значение
Memcache::delete — Удалить значение
Memcache::flush — Сбросить все существующие значения на сервере
Memcache::close — Закрывает соединение с memcached сервером
Установка
Для установки на сайт достаточно создать папку cache в любом месте проекта и в файле memcache.php указать путь до папки. Так же там можно изменить название папки и расширение файлов.

Для полноценной работы достаточно заинклюдить файл memcache.php в основном файле. После этого вы получите, поддержку стандартных функций memcache. Если же на сервере был ранее установлен memcache вы получите ошибку:
Fatal error:  Cannot redeclare "Название функции" in /path/to/memcache.php on line NUM
Работа с memcache
Memcache поддерживает два типа работы. - Процедурный стиль - Объектно Ориентированный
Процедурный стиль
``` $connect = memcache_connect('localhost',11211); memcache_set($connect, 'key_set', array('value1','value2')); print_r(memcache_get($connect, 'key_set')); ```
Объектно Ориентированный
``` $cache = new Memcache; // так же можно указать Memcached $cache->connect('localhost',11211); $cache->set('key_set', array('value1','value2')); print_r($cache->get('key_set')); ``` При желании можно структурировать кеш. Разложив его по папкам. Делается это при помощи **^ (caret)**
Например:

$cache->set('dir^file', array('value1','value2'));
Результат:

cache/
dir/
file.tmp
file.tmp.tmpTime
Тем самым, можно легко понять структуру кеша и при переходе на обычный memcache, не придется ничего менять.
Методы
На самом деле все эти методы можно подразделить на 3 группы:

- Работа со значениями - Работа с серверами и соединениями - Получение информации
Работа со значениями
Методы этой группы позволяют делать следующее:

- Устанавливать значения - Удалять эти значения - Заменять эти значения - Обращаться к этим значения по ключу - Управлять сроком жизни значений
+ пара специфичных методов для инкремента и декремента целочисленных значений.

Memcache::connect()
Фейковая функция существует только для совместимости.

bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )
- **string $host** - Хост Memcached. - **int $port** - порт, на котором Memcached слушает соединения. - **int $timeout** - Лимит в секундах, для подключения к демону. Подумайте дважды, прежде чем изменять значение по умолчанию 1 секунда - вы можете потерять все преимущества кэширования, если ваше соединение будет происходить слишком долго.
<?php
  $cache = new Memcache();
  $cache->connect('localhost', 11211, 30);
?>
Memcache::pconnect()
Фейковая функция существует только для совместимости.

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::addServer()
Фейковая функция существует только для совместимости.

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::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** - Флаг, указвающий, использовать ли сжатие в данном случае настоящего сжатия не производиться, так же можно использовать константы - **int $expire** - Время жизни значения(кэша). Если равно нулю, то бессрочно. Вы также можете использовать метку времени или количество секунд, начиная с текущего времени, но тогда число секунд, не может превышать 2592000 (30 дней).
<?php
  $cache = new Memcache();
  $cache->connect('localhost', 11211, 30);
  $cache->add( 'myfirst',  1000, MEMCACHE_COMPRESSED, 15 );
  $cache->set( 'mysecond', 2000, MEMCACHE_COMPRESSED, 15 );
?>
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();
  $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::get()
Вернёт запрошенное значение или FALSE в случае неудачи, или, если значение с таким ключём ещё не установлено.

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

string Memcache::get ( string $key [, int   &$flags ] )
array  Memcache::get ( array $keys [, array &$flags ] )
- **string $key** - ключ значения, или массив ключей, значения которых нужно получить. - **int $flag** - назначение этого параметра осталось для меня тайной. Я пробовал использовать некоторые целочисленные значения, но это не дало ни какого эффекта. Да и примеры в основном даны без его использования, из чего мною сделан вывод: можно прекрасно работать и без него :)
<?php
  $cache = new Memcache();
  $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::increment()
Увеличивает значение указанного ключа на указанное значение. Если значение указанного ключа не числовое и не может быть конвертировано в число, то оно изменит свое значение на значение, указанное как второй параметр. Memcache::increment() не создает элемент, если он еще не существует.

int Memcache::increment ( string $key [, int $value = 1 ] )
- **string $key** - ключ, значение которого нужно инкрементировать. - **int $value** - значение инкремента.
<?php
  $cache = new Memcache();
  $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::delete()
Удалить значение из кэша.

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

string Memcache::delete ( string $key [, int $timeout = 0 ] )
- **string $key** - ключ значение, которого нужно удалить. - **int $timeout** - Этот параметр так же устарел и не поддерживается, по умолчанию равен 0 секунд. Не используйте этот параметр.
Memcache::flush()
Memcache::flush() удаляет полностью все каталоги и файлы из папки cache

bool Memcache::flush ( void )
Пример ниже не выведет ничего.

``` 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')) ); ?>


<h3><a name="close">Memcache::close()</a></h3>
<p>Фейковая функция существует только для совместимости. Также можно использовать функцию memcache_close().</p>
<pre>
bool <strong>Memcache::close</strong> ( void )
</pre>

 

memcache.rar

Edited by kphp

Share this post


Link to post

@kphp в оригинале на гитхабе по понятнее. В этом коде OOP стиль нарушает srp,  сразу не поймешь, что это файловый кеш. Использовать PSR-16 круто, переключаться с файлового кеша на мемкеш, редис просто.

Share this post


Link to post
В 13.08.2020 в 16:33, kphp сказал:

Автор OTTO https://github.com/OTTO11/memcache

README.md
Эмулятор Memcache для обычного хостинга
Описание - все закешированные данные хранятся в файлах в json формате.

Установка
Методы
Memcache::connect — Открывает соединение с memcached сервером
Memcache::pconnect — Открывает постоянное соединение с memcached сервером
Memcache::addServer — Добавить memcached сервер в пул соединений
Memcache::add — Добавить значение
Memcache::set — Установить значение
Memcache::replace — Заменить значение
Memcache::get — Получить значение
Memcache::increment — Инкрементирует значение
Memcache::decrement — Декрементирует значение
Memcache::delete — Удалить значение
Memcache::flush — Сбросить все существующие значения на сервере
Memcache::close — Закрывает соединение с memcached сервером
Установка
Для установки на сайт достаточно создать папку cache в любом месте проекта и в файле memcache.php указать путь до папки. Так же там можно изменить название папки и расширение файлов.

Для полноценной работы достаточно заинклюдить файл memcache.php в основном файле. После этого вы получите, поддержку стандартных функций memcache. Если же на сервере был ранее установлен memcache вы получите ошибку:
Fatal error:  Cannot redeclare "Название функции" in /path/to/memcache.php on line NUM
Работа с memcache
Memcache поддерживает два типа работы. - Процедурный стиль - Объектно Ориентированный
Процедурный стиль
``` $connect = memcache_connect('localhost',11211); memcache_set($connect, 'key_set', array('value1','value2')); print_r(memcache_get($connect, 'key_set')); ```
Объектно Ориентированный
``` $cache = new Memcache; // так же можно указать Memcached $cache->connect('localhost',11211); $cache->set('key_set', array('value1','value2')); print_r($cache->get('key_set')); ``` При желании можно структурировать кеш. Разложив его по папкам. Делается это при помощи **^ (caret)**
Например:

$cache->set('dir^file', array('value1','value2'));
Результат:

cache/
dir/
file.tmp
file.tmp.tmpTime
Тем самым, можно легко понять структуру кеша и при переходе на обычный memcache, не придется ничего менять.
Методы
На самом деле все эти методы можно подразделить на 3 группы:

- Работа со значениями - Работа с серверами и соединениями - Получение информации
Работа со значениями
Методы этой группы позволяют делать следующее:

- Устанавливать значения - Удалять эти значения - Заменять эти значения - Обращаться к этим значения по ключу - Управлять сроком жизни значений
+ пара специфичных методов для инкремента и декремента целочисленных значений.

Memcache::connect()
Фейковая функция существует только для совместимости.

bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )
- **string $host** - Хост Memcached. - **int $port** - порт, на котором Memcached слушает соединения. - **int $timeout** - Лимит в секундах, для подключения к демону. Подумайте дважды, прежде чем изменять значение по умолчанию 1 секунда - вы можете потерять все преимущества кэширования, если ваше соединение будет происходить слишком долго.
<?php
  $cache = new Memcache();
  $cache->connect('localhost', 11211, 30);
?>
Memcache::pconnect()
Фейковая функция существует только для совместимости.

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::addServer()
Фейковая функция существует только для совместимости.

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::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** - Флаг, указвающий, использовать ли сжатие в данном случае настоящего сжатия не производиться, так же можно использовать константы - **int $expire** - Время жизни значения(кэша). Если равно нулю, то бессрочно. Вы также можете использовать метку времени или количество секунд, начиная с текущего времени, но тогда число секунд, не может превышать 2592000 (30 дней).
<?php
  $cache = new Memcache();
  $cache->connect('localhost', 11211, 30);
  $cache->add( 'myfirst',  1000, MEMCACHE_COMPRESSED, 15 );
  $cache->set( 'mysecond', 2000, MEMCACHE_COMPRESSED, 15 );
?>
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();
  $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::get()
Вернёт запрошенное значение или FALSE в случае неудачи, или, если значение с таким ключём ещё не установлено.

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

string Memcache::get ( string $key [, int   &$flags ] )
array  Memcache::get ( array $keys [, array &$flags ] )
- **string $key** - ключ значения, или массив ключей, значения которых нужно получить. - **int $flag** - назначение этого параметра осталось для меня тайной. Я пробовал использовать некоторые целочисленные значения, но это не дало ни какого эффекта. Да и примеры в основном даны без его использования, из чего мною сделан вывод: можно прекрасно работать и без него :)
<?php
  $cache = new Memcache();
  $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::increment()
Увеличивает значение указанного ключа на указанное значение. Если значение указанного ключа не числовое и не может быть конвертировано в число, то оно изменит свое значение на значение, указанное как второй параметр. Memcache::increment() не создает элемент, если он еще не существует.

int Memcache::increment ( string $key [, int $value = 1 ] )
- **string $key** - ключ, значение которого нужно инкрементировать. - **int $value** - значение инкремента.
<?php
  $cache = new Memcache();
  $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::delete()
Удалить значение из кэша.

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

string Memcache::delete ( string $key [, int $timeout = 0 ] )
- **string $key** - ключ значение, которого нужно удалить. - **int $timeout** - Этот параметр так же устарел и не поддерживается, по умолчанию равен 0 секунд. Не используйте этот параметр.
Memcache::flush()
Memcache::flush() удаляет полностью все каталоги и файлы из папки cache

bool Memcache::flush ( void )
Пример ниже не выведет ничего.

``` 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')) ); ?>


<h3><a name="close">Memcache::close()</a></h3>
<p>Фейковая функция существует только для совместимости. Также можно использовать функцию memcache_close().</p>
<pre>
bool <strong>Memcache::close</strong> ( void )
</pre>

 

memcache.rar  1   6 кБ

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

new Memcache();

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
×