memcached не принимает большие данные

305
10 сентября 2017, 02:35

Есть большой json-файл(примерно, 7,5 мегабайт), который подгружается с диска и декодируется примерно 3 секунды. Я захотел это исправить и положить декодированный в многомерный массив json в memcached, чтобы повысить скорость исполнения скрипта:

$cached_cities = $memcached->get('decoded-cities');
if($cached_cities) {
    $cities = $cached_cities;
} else {
    $uncached_cities = json_decode(file_get_contents('../../assets/json/cities.json'), true);
    $memcached->set('decoded-cities', $uncached_cities, 604800);
    $cities = $uncached_cities;
} 

Но это не работает нифига. Создал тестовый скрипт, положил в ключ строчку 'foo-bar' - положилось. А мой массив ни в какую в кэш не лезет.

Answer 1

Он не принимает, потому что ограничение по умолчанию на 1 запись 1 мб. Измените параметры запуска или конфиг как тут https://stackoverflow.com/a/29227471/5996783

Answer 2

У вас не получится сколько-нибудь существенно выиграть таким образом, так как при сохранении в memcached ваш массив будет снова сериализован. Затем снова рассериализован. То есть, вы натолкнётесь на ту же самую проблему, но с другим видом сериализации.

Лучшим решением было бы хранить результат чтения JSON сразу в файле PHP:

file_put_contents('cache.php', '<?php return '.var_export($array, true).';');

Этот шаг следует делать не каждый раз, а только при обновлении JSON файла. Например, делая так при сборке проекта:

if (!is_file('cache.php') || filemtime('data.json') > filemtime('cache.php')) {
    $data = json_decode(file_get_contents('data.json'), true);
    file_put_contents('cache.php', '<?php return '.var_export($data, true).';');
}

Использовать сохранённые таким образом данные проще простого:

$data = include 'cache.php';

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

Если же вам обычно не нужны все-все данные из этого файла, или вы собираетесь делать по ним выборку, то ещё лучше будет хранить данные в БД.

Если же вы думаете что сможете сделать проект быстрее за счёт отказа от БД, то подумайте хорошо. Современные БД очень оптимально работают с данными: вам нужно очень постараться чтобы обогнать их. Лучше будет сначала измерить скорость поиска в БД с необходимыми индексами прежде чем пытаться изобрести очередной велосипед.

В вашем случае обычные БД вроде MySQL будут работать быстрее хотя бы потому что им не нужно загружать в память весь набор данных при каждом запросе.

Answer 3

Скорее всего в php.ini не настроен, возможно что это проблема связаная, с тем что сервер memcahed не может принимать Json, эта настройка опять же есть в php.ini. Попробуйте прочесть это - http://php.net/manual/ru/memcached.setup.php и это - http://php.net/manual/ru/memcached.configuration.php

READ ALSO
Резервирование средств на сайте

Резервирование средств на сайте

Допустим, есть пользователь, который ввел денежные средства на сайтИ есть другой пользователь, который получить эти деньги после выполнения...

280
Сравнить текущие время с заданным

Сравнить текущие время с заданным

Необходимо сравнить текущие время с заданным, если текущие время больше заданного хотя бы больше на 30 минут, то вывести фразуУ меня выводит...

215