Дійсно приємна тема, і прочитавши кілька відповідей, я хочу поділитися своїми експериментами з цього питання.
У мене з’явився випадок використання, коли якусь «величезну» таблицю потрібно запитувати майже кожного разу, коли я розмовляю з базою даних (не запитую, чому, лише факт). Система кешування баз даних не є підходящою, оскільки вона не кешуватиме різні запити, тому я хоч про системи кешування PHP.
Я спробував, apcu
але це не відповідало потребам, пам'ять у цьому випадку недостатньо надійна. Наступним кроком було кешування у файл із серіалізацією.
Таблиця містить 14355 записів з 18 стовпцями, це мої тести та статистика зчитування серіалізованого кешу:
JSON:
Як ви всі сказали, головна незручність із json_encode
/ json_decode
полягає в тому, що він перетворює все на StdClass
екземпляр (або Об'єкт). Якщо вам потрібно циклічно перетворити його, перетворення його в масив - це, ймовірно, ви, і так, це збільшує час перетворення
середній час: 780,2 мс; використання пам'яті: 41,5 Мб; Розмір файлу кеша: 3,8 МБ
Msgpack
@hutch згадує msgpack . Гарний веб-сайт. Спробуємо, чи не так?
середній час: 497 мс; використання пам'яті: 32 Мб; розмір файлу кеша: 2,8 МБ
Це краще, але вимагає нового розширення; складання іноді бояться людей ...
IgBinary
@GingerDog згадує ігбінарне . Зауважте, що я встановив це, igbinary.compact_strings=Off
тому що я більше дбаю про ефективність читання, ніж про розмір файлу.
середній час: 411,4 мс; використання пам'яті: 36,75MB; розмір файлу кешу: 3.3MB
Краще, ніж пакет MSG. І все-таки цей потрібен і для компіляції.
serialize
/unserialize
середній час: 477,2 мс; використання пам'яті: 36,25MB; розмір файлу кеша: 5,9 Мб
Чим краще продуктивність, ніж JSON, тим більший масив, тим повільніше json_decode
, але ви вже це новий.
Ці зовнішні розширення звужують розмір файлу і здаються чудовими на папері. Цифри не брешуть *. Який сенс компілювати розширення, якщо ви отримаєте майже ті ж результати, що і у стандартної функції PHP?
Ми також можемо зробити висновок, що залежно від ваших потреб ви оберете щось інше, ніж хтось інший:
- IgBinary справді приємний і працює краще, ніж MsgPack
- Msgpack краще стискає ваші дані (зауважте, що я не пробував параметр igbinary compact.string).
- Не хочете компілювати? Використовуйте стандарти.
Це все, ще одне порівняння методів серіалізації, яке допоможе вам вибрати той!
* Тестовано з PHPUnit 3.7.31, php 5.5.10 - розшифровується лише за допомогою стандартного жорсткого диска та старого двоядерного процесора - середні цифри на 10 однакових тестах використання, ваші статистичні дані можуть бути різними
JSON_UNESCAPED_UNICODE
.