Вам действительно нужно автоматически загружать ВСЕ страницы сайта на основе классов при каждой загрузке страницы?

Я унаследовал PHP-сайт на основе классов, где каждая страница сайта является собственным классом. index.php определяет, какую страницу вы просматриваете, на основе параметра p, а затем вызывает этот конкретный класс. Например, страница поиска на сайте просто mysite.com/?p=search

Одна из первых строк index.php вызывает Autoload.php файл, который выполняет include каждую страницу сайта на основе классов. Это означает, что независимо от того, на какой странице вы находитесь, скрипт загружает каждую страницу / класс.

Мои вопросы:

  1. Между этими страницами / классами нет НЕТ связи, поэтому действительно ли необходимо загружать их все при каждой загрузке страницы?
  2. Это замедляет выполнение сценария include более 50 страниц / классов при каждой загрузке страницы или это незначительно?
  3. Если да, то не следует ли мне выполнять проверку на основе if, чтобы определить, какую страницу / класс мне следует загружать на основе параметра p, и загружать ТОЛЬКО его, а не загружать каждую страницу при каждой загрузке страницы?
  4. Или есть какой-то другой потенциальный недостаток, о котором я не знаю?

person ProgrammerGirl    schedule 09.06.2012    source источник


Ответы (2)


Это сбивающее с толку имя файла, поскольку автозагрузка - это механизм в PHP, который позволяет вам загружать классы по мере необходимости, хорошее решение, когда у вас много классов и для каждого выполнения потребуется только несколько.

Например:

function autoload($class_name) {
  $file = "classes/$class_name.php";

  // You could add some checks here (e.g. whether the file exists, whether the
  // class indeed exists after the file is loaded) to facilitate better errors,
  // of course this would marginally increase the time needed to load each class.

  require $file;
}

// Register the `autoload` function with PHP's autoload mechanism
spl_autoload_register('autoload');

// This will execute `autoload('Class')` (unless `Class` is already defined)
$instance = new Class;

Итак, чтобы ответить на ваши вопросы:

  1. Нет необходимости загружать их все, однако используемые классы должны быть доступны либо путем загрузки их всех вместе (текущая ситуация), либо путем их условной загрузки (if(p == 'whatever') require 'classes/whatever.php'), либо путем использования автозагрузки.

  2. Когда файл включается, возникает некоторая задержка, так как файл должен быть проанализирован / выполнен. PHP работает довольно быстро, но все же включение ненужных файлов - пустая трата времени. Если вы используете кэширование байт-кода, полученный байт-код все равно должен быть выполнен.

  3. Это один из путей улучшения, автозагрузка представляет собой более динамичную альтернативу.

  4. Зависимости могут быть проблемой, если какой-либо из ваших классов страниц зависит от другого класса, так как ваша условная загрузка может сильно раздуться.

Также небольшой дополнительный материал о кешировании байт-кода, если вы его используете:

В итоге, похоже, что, пока вы используете include или require для загрузки файла, кэширование байт-кода будет работать должным образом.

person connec    schedule 09.06.2012

Использование условного требования или включения выполняется медленно.

Просто require_once все классы в главном файле, который вы упомянули, без каких-либо условий, прямо в глобальной области. Скомпилированный код будет кэширован как один, и вы не пострадаете от загрузки дополнительного кода во время выполнения.

Изменить: вам будет полезно включить PHP APC или какой-либо другой ускоритель PHP.

Изменить 2: PHP APC станет частью ядра PHP в будущих выпусках (об этом было объявлено). Вы получите выгоду от PHP APC независимо от того, используете ли вы условную загрузку или загружаете все сразу. Если он у вас уже есть, загрузите все сразу для 50 страниц.

Редактировать 3: Загрузите исходный код PHP APC и найдите файл с именем apc.php. Запустите apc.php со своего сервера, чтобы увидеть некоторые очень хорошо выполненные статус и статистику APC, среди которых текущее использование памяти и максимальный объем памяти (также см. здесь).

person Tiberiu-Ionuț Stan    schedule 09.06.2012
comment
PHP компилируется перед выполнением. Загрузка файлов PHP во время выполнения происходит медленно (условия вызывают загрузку во время выполнения). Из Википедии, поскольку веб-сайт php.net не работает: Начиная с PHP 4, синтаксический анализатор PHP компилирует ввод для создания байт-кода для обработки Zend Engine, что обеспечивает более высокую производительность по сравнению с его предшественником-интерпретатором. - person Tiberiu-Ionuț Stan; 09.06.2012
comment
Извините, что не согласен с тем, что просто сказал: просто require_once все классы в главном файле, который вы упомянули. Я не думаю, что это хороший совет по сопровождению кода. Точно так же использование require_once обычно не рекомендуется, так как вы все равно страдаете от падения производительности (хотя и с APC) при использовании _once. Я бы сказал, что ответ Connec лучше и приведет к более чистой практике кодирования, как это происходит, когда вы создаете еще 50 сценариев (просто добавьте еще 50 строк кода, я полагаю?). - person Steve H; 09.06.2012
comment
При загрузке зависимостей, таких как определения классов, функций и констант, переопределение не допускается. Конечно, require_once - это то, что вам нужно. У него уже беспорядок. Его представления - это классы, а не простые файлы PHP (например, шаблон). 50 страниц легко для кеша кода операции, и автор вопроса задал вопрос о скорости загрузки классов, и это то, на что я отвечал, пожалуйста, прочтите вопрос перед тем, как проголосовать против ответа. - person Tiberiu-Ionuț Stan; 09.06.2012
comment
Я не думаю, что это хороший совет для поддержки кода. У него уже есть центральный файл (index.php), куда он уже загружает все классы. Мои советы ничего не меняют. Кроме того, мой совет - это, скорее, ответ на вопрос о производительности, который не улучшает и / или не снижает ремонтопригодность кода. - person Tiberiu-Ionuț Stan; 09.06.2012
comment
Полезность этого действительно зависит от того, использует ли @Programmer кеш опкодов. В противном случае требование всех классов при каждом выполнении очень неэффективно, достаточно, чтобы автозагрузка или условное включение, вероятно, дало бы экономию. В случае, если он использует кеш, мало что теряется при использовании автозагрузки, а добавление новых классов намного проще (просто добавьте файл класса в ожидаемое место, и вы можете начать использовать класс, а не добавлять где-то новую строку require_once) . - person connec; 09.06.2012
comment
вместо того, чтобы добавлять где-нибудь новую строку require_once. Я предлагал добавить все require_once в одном месте (index.php) (конечно, это не сработает, если все классы страниц имеют одинаковое имя, но если все так запутано, я не вижу здесь вариантов). - person Tiberiu-Ionuț Stan; 09.06.2012
comment
@ Tiberiu-Ionuț Stan - да, я прочитал вопрос, спасибо, я в основном имел в виду вопрос 4 OP (ремонтопригодность которого является допустимым недостатком использования require_once для всех файлов, вы не согласны?). Я бы также сказал, что ему, вероятно, не нужно было бы использовать require_once (было бы достаточно require) для файлов, поскольку все файлы загружаются в центральном месте (но снова можно возразить). Наконец, из того, что я помню, вам нужно было настроить APC для правильной обработки вызовов * _once, поскольку он не играл с ними хорошо VS require / include, который он правильно кэширует? - person Steve H; 09.06.2012
comment
Нет затрат на ремонтопригодность, если все требования находятся в одном файле. - person Tiberiu-Ionuț Stan; 09.06.2012
comment
Наконец, даже с точки зрения производительности, не зная приложения, я не думаю, что вы должны говорить. Скомпилированный код будет кэширован как один, и вы не пострадаете от загрузки дополнительного кода во время выполнения, поскольку вы предполагаете, что работает opcache, а также он просто выполняет не имеет смысла, точка. Что, если одна страница использует только 3 класса - это кажется совершенно неэффективным, использование APC для преодоления этой проблемы - всего лишь бандаж. Как я уже сказал, лучший ответ - это подключение и использование APC. Да, необходимо сохранить 50 строк кода - например, что, если OP хочет изменить макет папки / изменить имя класса? - person Steve H; 09.06.2012
comment
Пожалуйста, обратитесь к этим ссылкам для дальнейшего чтения / перспективы: stackoverflow.com/questions/186338/ и stackoverflow.com/questions/209728/ - person Steve H; 09.06.2012
comment
поскольку вы предполагаете, что работает opcache, и это просто не имеет смысла, точка. В этом есть смысл. Конструкция / функция языка include фактически заявляет в документации, что она должна действовать так, как если бы содержимое включаемого файла было вставлено в эту позицию. Таким образом, оптимизаторы законно (и практикуют) объединение всего этого в единое целое, если необусловленное включение обнаруживается в глобальной области видимости. - person Tiberiu-Ionuț Stan; 09.06.2012
comment
@ Tiberiu-Ionuț Стэн: Я думаю, нам придется согласиться, чтобы не соглашаться по этому поводу (но ваш ответ можно было бы значительно улучшить, отсюда и голосование "против"). Вкратце, ответ на вопросы OP должен быть 1) Нет, 2) Да, 3) См. Ответ Connec, 4) Да, ремонтопригодность. Конечно, мы должны сделать ряд предположений из предоставленного вопроса, но предположение, что OP может / должен будет использовать APC, не должно быть одним из них. Более безопасным было бы предположение, что производительность будет лучше только при загрузке требуемых классов (отсюда и автозагрузка) - намного чище, и вам придется предполагать лучше. Наконец, протестируйте приложение. - person Steve H; 09.06.2012
comment
Я уже приводил аргумент против «Да, ремонтопригодности», вы не рассмотрели его. Пожалуйста, не делайте вывод, какими должны быть ответы, пропуская обсуждение, иначе я не вижу смысла в этой ветке комментариев. - person Tiberiu-Ionuț Stan; 09.06.2012
comment
Цепочка комментариев - это не то же самое, что обсуждение, и, кроме того, я думал, что затронул тему ремонтопригодности (вопрос OP 4 - это не ясно?). Я также не понимаю, почему вы (при условии, что это были вы) были проголосовали за мои комментарии, кроме того, что я не проголосовал за ваш ответ? Вы не ответили ни на что из того, что я упомянул, чтобы поддержать свой первоначальный ответ. Я действительно не понимаю, почему вы думаете, что загрузка 50 файлов - хорошая идея, когда решение (автозагрузка) решает эту проблему, и без тестирования конкретного приложения вы должны были бы сделать вывод, что это лучший ответ. - person Steve H; 10.06.2012
comment
обратился к вопросу о ремонтопригодности. Я сказал, что вы не рассмотрели мой аргумент против вашего утверждения, проигнорировали его и использовали свое заявление о ремонтопригодности в качестве вывода. Я не проголосовал против вашего комментария (это возможно?). Пожалуйста, перечитайте свои заявления о ремонтопригодности в первых сделанных вами комментариях. Мне просто пришлось не согласиться, учитывая ситуацию, представленную автором. - person Tiberiu-Ionuț Stan; 10.06.2012
comment
Это мой последний комментарий, мы ходим по кругу. Я думаю, вы упустили суть, я старался не повторять проблемы с производительностью, потому что Connec был готов, и совершенно правильно рассмотрел доводы в пользу использования автозагрузки как в ответах, так и в комментариях (которые вы предпочли проигнорировать). Итак, вы ответили: «Оставьте как есть» и используйте APC, если это могло быть правдой, если бы ряд условий был правильным. Я хочу сказать следующее, поскольку вы не знаете, сколько классов нужно загрузить на каждый экземпляр, можно с уверенностью предположить, что загрузка всех 50 классов не только неэффективна, но и БУДЕТ влиять на производительность (насколько мы - person Steve H; 10.06.2012
comment
не знаю). Поэтому ваш ответ «просто придерживайтесь require_once» на самом деле не лучший для производительности (при условии, что вышесказанное верно). Моя проблема с вашим ответом заключалась в том, что вы просто слепо сказали, что продолжайте использовать 50 операторов require_once, хотя OP заявил, что это может быть причиной для беспокойства (так что ВЫ действительно не ответили на их ПОЛНЫЙ вопрос (вопросы), и слишком много упоминания в значительной степени нахмурилось на. Проблемы с ремонтопригодностью являются частью полного ответа (который относится к вопросу 4 OP) и является веской причиной того, почему БОЛЬШИНСТВО людей используют автозагрузку. Так что, не зная больше о приложении OP, я не понимаю, как сказать ... - person Steve H; 10.06.2012
comment
продолжать использовать операторы require_once лучше всего для производительности (потому что это не так - при условии, что автозагрузка доступна). Поэтому, если OP не вернется и не скажет, что автозагрузка не является вариантом или по крайней мере 30 или 40 классов используются в КАЖДОМ запросе, я не вижу, как отказ от автозагрузки будет лучшим вариантом. Один вопрос к вам: если APC недоступен (по какой-либо причине), ваш ответ неверен, так как OP спрашивал о производительности и, конечно, загрузка классов с использованием require_once (особенно 50, когда вы даже не используете их все) IS снижение производительности, то степень успеха должна определяться сравнительным анализом. - person Steve H; 10.06.2012
comment
Это уже третий раз, когда вы меняете свою позицию в соответствии с ходом обсуждения, не обесценивая свои предыдущие пункты. По крайней мере, теперь у вас есть сильная сторона, о которой вы думаете. По своему опыту я советовал, что 50 требует заметного снижения производительности (+ APC). - person Tiberiu-Ionuț Stan; 10.06.2012