Есть большой 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'
- положилось. А мой массив ни в какую в кэш не лезет.
Он не принимает, потому что ограничение по умолчанию на 1 запись 1 мб. Измените параметры запуска или конфиг как тут https://stackoverflow.com/a/29227471/5996783
У вас не получится сколько-нибудь существенно выиграть таким образом, так как при сохранении в 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 будут работать быстрее хотя бы потому что им не нужно загружать в память весь набор данных при каждом запросе.
Скорее всего в php.ini не настроен, возможно что это проблема связаная, с тем что сервер memcahed не может принимать Json, эта настройка опять же есть в php.ini. Попробуйте прочесть это - http://php.net/manual/ru/memcached.setup.php и это - http://php.net/manual/ru/memcached.configuration.php
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Допустим, есть пользователь, который ввел денежные средства на сайтИ есть другой пользователь, который получить эти деньги после выполнения...
Необходимо сравнить текущие время с заданным, если текущие время больше заданного хотя бы больше на 30 минут, то вывести фразуУ меня выводит...