Оптимизировать загрузку фреймворка PHP - PullRequest
0 голосов
/ 01 сентября 2009

У меня есть пользовательский фреймворк, написанный на PHP, который мне поручено оптимизировать. Эта структура является общей кодовой базой, которая загружает MVC-модули для обеспечения различных функциональных возможностей. Каждый модуль представляет собой каталог, содержащий несколько классов PHP для контроллеров и моделей и файлы PHP для представлений.

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

Общий процесс обработки любого заданного URI следующий:

  1. Все базовые системные классы включены
  2. Установлен глобальный обработчик исключений и некоторые глобальные переменные
  3. Считывается системный файл конфигурации. (Это файл, заполненный инструкциями PHP для установки переменных конфигурации)
  4. Соединение с базой данных установлено
  5. Папка модулей сканируется с помощью opendir (), и каждый модуль проверяется на корректность и отсутствие синтаксических ошибок, а затем включается.
  6. Загружен второй файл конфигурации, который устанавливает конфигурацию для модулей
  7. Создается новый экземпляр каждого модуля (вызывая его метод __construct () и, возможно, создавая другие подключения к базе данных, выполняя отдельные процедуры запуска и т. Д.)
  8. URI проверяется и передается в соответствующий модуль

Шаги 1 - 7 почти всегда будут одинаковыми. Они всегда будут выполнять одни и те же операции, если новые модули не установлены или файл конфигурации не изменен. У меня вопрос, что можно сделать, чтобы оптимизировать процесс? В идеале, я бы хотел какой-то способ обработки нескольких запросов, аналогичный тому, как работают запросы KeepAlive. Все накладные расходы на инициализацию всех модулей кажутся пустой тратой только на чтение () одного файла изображения или файла CSS, просто на то, чтобы эти же накладные расходы снова были обработаны для другого запроса.

Есть ли способ уменьшить накладные расходы фреймворка, как это? (Я даже не знаю, может ли кто-нибудь помочь мне, не изучив весь код, это может быть безнадежным вопросом)

Ответы [ 3 ]

2 голосов
/ 01 сентября 2009

Обычно плохая идея связывать динамический поток веб-сервера, обслуживающий статический контент. Apache, IIS, Nginx, et. и др. уже сделать все необходимое, чтобы подать эти файлы. Если каждый статический ресурс находится где-то в общедоступной документации и имеет уникальный URL-адрес, вам не нужно беспокоиться о том, что PHP загружает их.

Кроме того, если вы можете убедиться, что ваши заголовки, связанные с кэшем (ETag, Last-Modified и т. Д.) Генерируются правильно, и каждый клиент должен запрашивать каждый файл только один раз. Бесплатное кеширование == победа!

0 голосов
/ 01 сентября 2009

Почему бы не переместить шаг 8 до шага 5? Сначала проверьте URL, а затем загрузите модули на основе результатов.

Еще один:

каждый модуль проверен на корректность и отсутствие синтаксических ошибок, а затем включен.

Вы действительно проверяете синтаксис файлов перед including() ими? Если да, то зачем это нужно?

0 голосов
/ 01 сентября 2009

Существует ли причина, по которой все модули необходимо загружать для каждого запроса? Почему бы не разрешить контроллерам указывать, какие модули им требуется загрузить, и загружать только те, которые запрашиваются?

...