
Здравствуйте, уважаемые читатели! Простите меня за столь долгое отсутствие.. У меня было очень много перемен в жизни, которые отбирали и время, и силы. Как Вы уже наверное знаете я жил всю жизнь в областном центре Волынской области - в г. Луцке. На данный момент я нашел работу в Киеве, мне было необходимо переехать и вот я в Киеве уже почти 2 месяца. Меня пригласили работать в корпорацию Fozzy Group прикладным программистом.
Также все свободное время посвящал учебе в университете и работе над своими проектами Linkgator и Renter [в разработке]. В общем было трудно, но я успешно решил все поставленные в моей жизни задачи, сейчас вхожу в привычный ритм, но уже в Киеве.
Ладно, пора заканчивать этот оффтоп. Пожалуй, приступлю к делу. Итак, темой сегодняшней статьи будет ускорение производительности Zend Framework приложений, путем автозагрузки и сборки фреймворка в один файл!
Описание идеи
Как Вы уже могли заметить Zend Framework состоит из множества файлов, которые очень удобно разложены по папкам. Структура отвечает полностью названию класса, что очень удобно - не приходится долго искать и разбираться. Это была одна сторона медали. Второй вопрос, это огромное количество файлов, которое подключается при каждом запросе, создавая довольно большую нагрузку на Ваш сервер.
Решение я видел только в двух вариантах:
- Сборка библиотеки в один файл
- Сборка библиотеки как расширения PHP
Второй вариант я себе технически плохо представляю, т.к. с серверным ПО знаком поверхностно. На сколько мне известно, можно как-то положить байт-код библиотеки в виде расширения, но как? Я себе этого не представляю. Это может сделать либо C-программер либо хороший администратор серверного ПО. Но, к сожалению, пока что не я.
Итак, у меня остался только один вариант: собрать все в один PHP файл. Но не буду же я собирать абсолютно все файлы фреймворка в один файл, зачем мне все? Подумав, я пришел к выводу что можно собрать файл только с необходимыми классами через автозагрузку, если написать свой автолоадер.
В автолоадер попадают только те классы, которые используются. Мы проверяем не загружен ли этот класс в память, если да, то автолоадер ничего не делает. Если нет - подключаем класс, записываем класс в собранный файл. При последующем запуске приложения недостающий класс уже будет вписан в сборный файл и больше подключатся не будет.
Такой метод даст огромный прирост производительности. Чем больше файлов используется в проекте и чем больше файлов будет записано в сборный файл - тем выше будет производительность системы, сравнительно с тем, что было до внедрения данного механизма.
Реализация
Как всегда самая вкусная часть. Для начала приведу Вам код созданного автозагрузчика. Некоторые части кода были взяты тут, но были заточены мной под данную задачу. Мне в описанном примере не понравилась реализация. Как-то слишком все было запутанно. Я же все упростил до 2 классов, 1 сборного файла и 2 строк в бутстрапе. Сначала вообще пытался написать все полностью сам, пока не понял, что я не слишком силен в регулярных выражениях и не увидев приведенную выше статью.
Собственно код очень простой и хорошо документирован, поэтому детали его работы не вижу смысла излагать. Вот еще один: класс Exception:
Вот эти два класса и работают над нашей задачей
Теперь давайте сконфигурируем наш бутстрап файл. Добавьте эти строки кода сразу после инициализации include_path
Все, интеграция в Ваш проект завершена. Но, как выявилось, не все так гладко как бы хотелось. Собранный файл еще придется поправлять руками, т.к. бывают разного рода проблемы. Но я не думаю, что это сильно затруднит - ведь это надо сделать всего один раз.
Конечно, для того, чтобы все успешно заработало необходимо вырезать все require_once.
Теперь Ваш сборный файл будет расти. Автолоад будет включен, но когда будут собраны все используемые классы, он просто не будет вызываться.
Результат
После успешной интеграции и сборки в один файл Вы должны заметить существенный прирост производительности. При этом у очень рекомендуется использовать байт-код кешеры для достижения максимального эффекта. Говорить о каких-то конкретных цифрах очень тяжело: все зависит от специфики Вашей системы.
Быстрых Вам проектов!

