Действительно хорошая тема, и после прочтения нескольких ответов я хочу поделиться своими экспериментами по этому вопросу.
У меня есть прецедент, когда нужно «проверять» огромную таблицу почти каждый раз, когда я разговариваю в базу данных (не спрашивайте, почему, просто факт). Система кэширования базы данных не подходит, поскольку она не будет кэшировать разные запросы, поэтому я, хотя, о системах кэширования php.
Я попробовал apcu
, но он не соответствовал потребностям, в этом случае память недостаточно надежна. Следующим шагом было кэширование в файл с сериализацией.
Таблица имеет 14355 записей с 18 столбцами, это мои тесты и статистика при чтении сериализованного кеша:
Как вы сказали, основным неудобством с json_encode
/ json_decode
является то, что он преобразует все в экземпляр StdClass
(или Object). Если вам нужно зацикливать его, преобразование его в массив - это то, что вы, вероятно, сделаете, и да, это увеличивает время преобразования
среднее время: 780,2 мс; использование памяти: 41,5 МБ; Размер файла кеша: 3.8MB
blockquote>Msgpack
@hutch упоминает msgpack . Довольно сайт. Попробуем попробовать?
среднее время: 497 мс; использование памяти: 32 МБ; размер кеш-файла: 2,8 МБ
blockquote>Это лучше, но требует нового расширения; компиляция иногда испуганных людей ...
IgBinary
@GingerDog упоминает igbinary . Обратите внимание, что я установил
igbinary.compact_strings=Off
, потому что мне больше нравятся показатели чтения, чем размер файла.среднее время: 411,4 мс; использование памяти: 36,75 МБ; размер кеш-файла: 3,3 МБ
blockquote>Лучше, чем пакет msg. Тем не менее, это требует компиляции.
serialize
/unserialize
среднее время: 477,2 мс; использование памяти: 36,25 МБ; размер кеш-файла: 5.9MB
blockquote>. Чем лучше производительность, чем JSON, тем больше массив, медленнее
json_decode
, но вы уже новичок в этом.Эти внешние расширения сужают размер файла и отлично смотрятся на бумаге. Числа не лежат *. Какой смысл компилировать расширение, если вы получите почти те же результаты, что и стандартные функции PHP?
Мы также можем вывести, что в зависимости от ваших потребностей вы выберете что-то другое, чем кто-либо другой:
- IgBinary действительно хорош и работает лучше, чем MsgPack
- Msgpack лучше сжимает ваши данные (обратите внимание, что я не пробовал вариант igbinary compact.string).
- Не хотите компилировать? Использовать стандарты.
Вот и другие сравнения методов сериализации, чтобы помочь вам выбрать один!
* Протестировано с помощью PHPUnit 3.7.31, php 5.5.10 - только декодирование со стандартным жестким диском и старым двухъядерным процессором - средние числа на 10 одинаковых тестах использования, ваша статистика может отличаться