Горбушка
Ищу её...
- Регистрация
- 2 Май 2008
- Сообщения
- 3.444
- Реакции
- 2.524
- Автор темы
- #1
Всем привет.
Ковырялся я в очередной раз в коде DLE и заметил... DLE использует способ хранение кэша через json_encode.
И вот тут я оказался в ступоре.
Беглое тестирование показало, что serialize примерно на 10% быстрее, чем json_encode. По крайней мере, так показала PHP 7.1 под Windows.
Причём, это используется только для системного кэша, т.е.:
Если мы посмотрим на кэш для модулей и т.д., то там окажется вообще нет способа хранения, он хранит текст ровно так, как его туда отправили О_о. Т.е. сохранить массив в кэше не получится от слова совсем:
Нет, конечно можно сначала использовать json_encode или serialize к массиву, а уже потом это пихать в кэш, но мне всегда казалось, что кэш должен сам заботиться об этом, хотя, я могу и ошибаться...
Собственно, так оно и есть, вот так мы отправляем в кэш данные по комментариям, например:
Может кто-нибудь объяснить, почему DLE использует такой подход к кэшу? Почему используется более долгий по времени вариант? Почему не используется json/serialize при записи обычного кэша?
Даже если мы захотим записать строку/текст, а не массив - сериализация всё равно ж выполнится, нет?
Ну и как всегда, сам спросил - сам отвечаю...
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
Если вкратце, serialize имела кучу уязвимостей и на нормальных хостингах отключена.
json_encode при этом безопаснее как для программиста, так и для сервера, при этом 10% скорости не критично на столь быстрых операциях.
Если ещё проще, то ЦелСофт здесь молодец.
Ковырялся я в очередной раз в коде DLE и заметил... DLE использует способ хранение кэша через json_encode.
И вот тут я оказался в ступоре.
Беглое тестирование показало, что serialize примерно на 10% быстрее, чем json_encode. По крайней мере, так показала PHP 7.1 под Windows.
Причём, это используется только для системного кэша, т.е.:
PHP:
function set_vars($file, $data) {
$file = totranslit($file, true, false);
if ( is_array($data) OR is_int($data) ) {
file_put_contents (ENGINE_DIR . '/cache/system/' . $file . '.php', json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ), LOCK_EX);
@chmod( ENGINE_DIR . '/cache/system/' . $file . '.php', 0666 );
}
}
PHP:
function create_cache($prefix, $cache_text, $cache_id = false, $member_prefix = false) {
global $config, $is_logged, $member_id, $mcache;
if( !$config['allow_cache'] ) return false;
if( $is_logged ) $end_file = $member_id['user_group'];
else $end_file = "0";
if( ! $cache_id ) {
$key = $prefix;
} else {
$cache_id = md5( $cache_id );
if( $member_prefix ) $key = $prefix . "_" . $cache_id . "_" . $end_file;
else $key = $prefix . "_" . $cache_id;
}
if($cache_text === false) $cache_text = '';
if( $config['cache_type'] ) {
if( $mcache->connection > 0 ) {
$mcache->set( $key, $cache_text );
return true;
}
}
file_put_contents (ENGINE_DIR . "/cache/" . $key . ".tmp", $cache_text, LOCK_EX);
@chmod( ENGINE_DIR . "/cache/" . $key . ".tmp", 0666 );
return true;
}
Собственно, так оно и есть, вот так мы отправляем в кэш данные по комментариям, например:
PHP:
if ( $allow_cache ) create_cache ( "comm_".$allow_cache, json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ), $this->query );
Может кто-нибудь объяснить, почему DLE использует такой подход к кэшу? Почему используется более долгий по времени вариант? Почему не используется json/serialize при записи обычного кэша?
Даже если мы захотим записать строку/текст, а не массив - сериализация всё равно ж выполнится, нет?
Ну и как всегда, сам спросил - сам отвечаю...
Для просмотра ссылки Войди
Для просмотра ссылки Войди
Если вкратце, serialize имела кучу уязвимостей и на нормальных хостингах отключена.
json_encode при этом безопаснее как для программиста, так и для сервера, при этом 10% скорости не критично на столь быстрых операциях.
Если ещё проще, то ЦелСофт здесь молодец.
Последнее редактирование модератором: