Ускорение парсинга INI-файлов для Zend Framework веб-приложений (в 4-5 раз)

В этой статье я расскажу, как можно увеличить скорость обработки запросов в вашем проекте на ZF с помощью уменьшения времени, необходимого на парсинг INI-файлов конфигурации.

Не секрет, что при создании большого приложения на Zend Framework большинство разработчиков используют для хранения настроек конфигурационные файлы. Некоторые любят XML-формат, другие модный YAML, я же возможно из-за своего админского прошлого предпочитаю INI-формат.

В Zend_Framework для парсинга INI файлов используется компонент Zend_Config_Ini. Но парсинг сам по себе вещь довольно накладная.

Скрин от фреймфорка LiteMVC иллюстрирующий обращения к парсеру при каждом запросе

Как его ускорить? Можно использовать кэшер, и кэшировать результат парсинга. Но иногда такой возможности нет, т.к. в самом конфиге хранятся настройки системы кэширования. Какой есть ещё вариант?

Yaf Framework

Этот китайский проект очень заинтересовал меня в последнее время. Создатели Yaf  (Yet Another Framework) поставили своей целью написать ZF на C. Устанавливается он просто:

Потом вам надо будет включить расширение, добавив строчку:

в ваш php.ini (или отдельный yaf.ini файл). И перезапустить интерпретатор php(fpm или mod_php вместе с apache). Этот фреймворк содержит следующие классы:

  • Yaf_Application
  • Yaf_Dispatcher
  • Yaf_Bootstrap_Abstract
  • Yaf_Plugin_Abstract
  • Yaf_Router
  • Yaf_Route_Static
  • Yaf_Route_Simple
  • Yaf_Route_Supervar
  • Yaf_Route_Rewrite
  • Yaf_Route_Regex
  • Yaf_Route_Map
  • Yaf_Config_Ini
  • Yaf_Config_Simple
  • Yaf_Controller_Abstract
  • Yaf_Action_Abstract
  • Yaf_Request_Http
  • Yaf_Request_Simple
  • Yaf_Exception
  • Yaf_Exception
  • Yaf_View_Simple
  • Yaf_Response_Abstract
  • Yaf_Response_Simple
  • Yaf_Response_Http

Как вы можете видеть, классы аналогичны ZF классам. В этой статье я рассмотрю использование Yaf_Config и его бенчмарки по сравнению с Zend_Config.

Zend_Config_Ini vs Yaf_Config_Ini

Для проведения тестовых испытаний возмём вот такой конфиг:
/cfg/application.config.ini

В ./lib/Zend сохраним копию ZendFramework, Yaf у нас уже установлен. Поэтому напишем простенький тест:

zf.php

yaf.php

Результаты тестирования

Ну что-же, теперь время сухих бенчмарков.

zf.php

yaf.php

Выводы

Скорость парсинга ZF 1.10.3: 842.64 запросов в секунду.
Скорость парсинга Yaf: 4076.21 запросов в секунду.
Ускорение: почти в 5 раз (4.83)!

К сожалению в Yaf не так много компонентов как в ZF, с поддержкой и сообществом там совсем туго, однако некоторые простые и часто-используемые компоненты (например Zend_Config_Ini и Zend_View) вполне можно заменить на их аналоги из Yaf, или сделать обертку.

 

Ссылки

http://litemvc.org/2010/06/04/optimising-ini-parsing/

4 Comments

  1. Я бы не сказал, что Yaf – это Zend на C, потому что есть различия в API и достаточно серьёзные. Лучше относится к Yaf как к отдельному фрейморвку и разрабатывать проект с учётом его особенностей.

    По поводу скорости разбора config файлов – не думаю, что имеет смысл оптимизировать эту задачу, так как разобранный config хранится в кеше и по сути эта операция должна выполнятся только один раз при изменении конфигурационного файла.

    1. Ну по крайней мере, ближайший аналог Yaf это как раз таки ZF. Естественно в YAF нет ооочень многого, но думаю что за скелет его вполне можно взять, а потом уже на php добавлять “мяса”. По поводу разбора конфигов – да, это скорее синтетический тест. Но думаю в некоторых задачах такое решение может пригодиться.

  2. Зачем вообще хранить конфиги в ini, если можно их хранить в виде подключаемого php файла, содержащего в себе define и $_GLOBALS[‘config’], при чём с APC их данные уже закэшированны в памяти.

Leave a Reply to Андрей Токарчук Cancel reply