Почему хранение serialized конфига предпочтительнее нативного php?

Читал в интернетах, что хранить настройки приложения php выгодно хранить в сериализованном виде.

Но ведь чтобы его потом получить, нужно будет выполнить операцию unserialize. Почему же тогда хранить уже сразу в чистом php типа
<?php return array( . . . );
считается более медленным путем? Потому что так файл будет длиннее или как?

Например, статья на Хабре: Самые быстрые настройки для PHP-скриптов
  • Вопрос задан
  • 2848 просмотров
Решения вопроса 1
@m-haritonov
1. По-поводу скорости.

Без акселераторов unserialize(file_get_contents('...')) у меня выполняется быстрее, чем include '...' примерно в 2-3 раза. Можно объяснить это тем, что при include выполняется парсинг PHP кода и, в отличии от unserialize, необходимо распознавать намного больше языковых конструкций (в include версии можно, например, в качестве значения указать вызов функции; в unserialize — нет).

С акселератором (я использовал opcache) ситуация прямо противоположная — include '...' быстрее, чем unserialize(file_get_contents('...')) примерно в 2-3 раза.

Итог: поскольку акселератор можно настроить так, чтобы он не влиял на корректность работы PHP скрипта, побеждает include.

2. Безопасность.

Если PHP скрипту необходимо не только читать конфигурационный файл, но и производить запись в него, то на конфигурационный файл будут выставлены соответствующие права и появится потенциальная дыра в безопасности (связанная с тем, что кто-либо теперь сможет изменить код исполняемого PHP файла). В случае unserialize такой опасности нет.

Также unserialize подходит, если конфигурационный файл поступает из ненадёжного источника (например, получается с другого сервера по HTTP и по пути может быть изменён злоумышленником; или, например, квалификации администратора недостаточно для редактирования PHP кода и он может допустить в нём ошибку в случае варианта с include).

Итог: в номинации "безопасность" побеждает unserialize.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
nazarpc
@nazarpc
Open Source enthusiast
А ещё тестировал сам и видел статьи - json_encode/decode() быстрее serialize/unserialize(), и для хранения конфигов их достаточно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы