Php apcu etc

Сериализованные данные (массивы и только массивы) хранятся просто в файлах с доступом по ключу md4. Пример: ./cache/0e/0e0b0b9dab3ebe43777ed0143c98b39a.txt
Не хочу каркать, но в таком случае проблемы обеспечены; в данном случае лучше вообще не сериализовать данные.
Это справедливо, повторюсь, для массивов от 500 членов и при частой записи.
При редкой записи, впрочем, может сработать.
Ключ доступа тоже стрёмный — при больших объёмах могут быть коллизии (ок 1000000 страниц — вероятность приблизится к 100%).
Лучше обратимое шифрование — base64 например больше, но однозначнее.
Я не совсем понимаю, что Вы там в данных сериализуете?
Если это кеш, то стоит ли?

Я когда-то писал в кеш вывод движка по следующей схеме:
PHP:
if (is_cache_enabled()){
   //If enabled cache
   $cache = new CACHE;
   $cache->start_cache();
   $cache->time_file_cache = $system->config['cache'];//
   if (!$cache->is_fresh())   {
     include_once(SYSTEM_MODULES_PATH.'output.php');
     $cache->save_cache();
   }
   $cache->clear_cache();
   if ($cache->show_cache()) echo $cache->CONTENT;
} else {
   //If cache not enabled
   include_once(SYSTEM_MODULES_PATH.'output.php');
}
Класс кеша
PHP:
DEFINE('CACHE_DIR',DATA_PATH.'cache');

CLASS CACHE

{//Begin class

var $enable_cache = true;

//Хэш код файла
var $hash_code='';

//Каталог кэширования файлов
var $dir_cache = CACHE_DIR;

//Время жизни кеша в секундах

var $time_file_cache=600;

//Хранение значения контента файла

var $CONTENT;

function __construct(){

if ($this ->enable_cache) return true;

else return false;

}

/*

Показать кеш, если нет - создать.

*/

function start_cache (){

if ($this ->enable_cache) {
ob_start();
return true;
}
else return false;

}

/*

Показать кеш

*/

function show_cache() {

if ($this->is_fresh()) {               //Кеш существует и не просрочен

$this->CONTENT = file_get_contents($this->dir_cache.'/'.$this->hash_code);

return true;

} else return false;


}

/*

Сохранить кеш

*/

function save_cache() {

$this->CONTENT = ob_get_contents();         //Записываем буфер в переменную

rcms_delete_files($this->dir_cache."/".$this->hash_code);

file_write_contents($this->dir_cache."/".$this->hash_code, $this->CONTENT);

}

/*

Очищаем буфер кеша

*/

function clear_cache() {

ob_end_clean();

}

/*

Проверка есть ли кеш и свежий ли он

*/

function is_fresh() {

$this->hash_code = md5($_SERVER['REQUEST_URI']);    //Хэш код текущей страницы

if (is_file($this->dir_cache.'/'.$this->hash_code)) {//кеш есть

if ((filemtime($this->dir_cache.'/'.$this->hash_code)+ $this->time_file_cache) > time()) //не просрочен

return true;

} else return false;

}

}
Таким образом, если кеш не просрочен — движок не грузится, а выдает из файла напрямую, нагрузка падает очень сильно. Но и файлов плодится множество.
Ещё недостаток — применение md5, но на тех проектах, где применяется — мало страниц для этого, до 10000.
 
Последнее редактирование:
Не хочу каркать, но в таком случае проблемы обеспечены; в данном случае лучше вообще не сериализовать данные.
Это справедливо, повторюсь, для массивов от 500 членов и при частой записи.
При редкой записи, впрочем, может сработать.
Ключ доступа тоже стрёмный — при больших объёмах могут быть коллизии (ок 1000000 страниц — вероятность приблизится к 100%).
Лучше обратимое шифрование — base64 например больше, но однозначнее.
Я не совсем понимаю, что Вы там в данных сериализуете?
Если это кеш, то стоит ли?
Таким образом, если кеш не просрочен — движок не грузится, а выдает из файла напрямую, нагрузка падает очень сильно. Но и файлов плодится множество.
Ещё недостаток — применение md5, но на тех проектах, где применяется — мало страниц для этого, до 10000.

Ты явно с нулями ошибся. 16 значений по 16 раз это 16 в 16 степени. 18 446 744 073 709 600 000
Я даже словами сказать не могу сколько это :)

К тому же, если уникальность ключа станет проблемой можно перейти еще на что-то.

Какие массивы по 500 членов? У меня массивы по 100к элементов есть.
Откуда будут проблемы, от записи/чтения на диск? Даже если предположить, что это долго писать и читать на ssd, то там у меня еще хитрая хрень. Весь кеш обновляется через очередь заданий, которая тошнит себе потихоньку в фоне, запускаясь через cron. Поэтому такой ебалы, что кеш устарел и его надо немедленно обновить там у меня нет. Если тебе интересно, посмотри исходники моей кеш либы. Прежде чем ее сейчас выражаясь образно на "жигуль" ставить, она у меня на мопеде проходила целый год в боевых условиях. Не по 300 человек сразу, но по 1500 юзеров в сутки бывало.
 
Отлично показал себя APCU. Там где было >400мс, стало в пределах 1мс. Только вот включить его в режиме fastcgi не удается.
Я запустил сегодня, nginx + php-fpm7.2 + apcu cache ! А что не так ?
 
Назад
Сверху