Ускорение парсинга 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/