2010-02-19 2 views
36

Неопытный PHP вопрос:PHP включают(): Размер файла и производительности

У меня есть файл сценария PHP, что мне нужно включить на разных страницах много раз во многих местах.

У меня есть возможность либо разбивать прилагаемый файл на несколько небольших файлов, либо включать их по мере необходимости ... ИЛИ ... Я мог бы просто сохранить все это вместе в одном файле PHP.

Мне интересно, есть ли влияние производительности при использовании большего или меньшего файла для include() в этом контексте? Например, есть ли разница в производительности между файлом 200 КБ и файлом 20 КБ?

спасибо.

ответ

43

Будет разница между файлом 200 КБ и 20 КБ ... Но вы, вероятно, не заметите этого: файл размером 200 КБ не так уж и велик - и вы обычно используете много файлов, которые не являются «маленькими» », когда вы создаете большое приложение.

Есть две вещи, которые требуют времени, когда вы загружаете файл .php:

  • Исходный PHP код «скомпилированный» в «опкоды» - это вполне эквивалентно JAVA байткод
    • Это делается каждый раз, когда PHP-файл включен по умолчанию
    • Но, используя некоторый кэш опкода как APC, эти опкоды могут быть сохранены в памяти, и этот сборник материал не делал каждый раз, nymore - это здорово: это будет означать меньшее использование процессора, поскольку компиляция больше не будет выполнена (это будет сделано только время от времени).
  • Коды операций выполняются
    • В зависимости от того, что сценарий содержит, это может занять некоторое время, или нет:
    • Если файл содержит только функции или классы определений, это не займет много времени : ничего не будет выполнено.
    • Если файл содержит инструкции, это займет больше времени ^^


Как sidnote: в общей ситуации, вы получите гораздо больше времени/CPU/ресурсы оптимизации ваши SQL-запросы или добавление некоторого кэширующего меканизма, чем размышление об этом.

+0

Благодарим вас за добавленное объяснение. – Tom

+0

Добро пожаловать :-) Удачи! –

+2

Даже с APC рассмотрите возможность использования пользовательской функции __autoload/spl_autoload_register - мне удалось включить только файлы модели в пользовательскую среду MVC, в которой был вызван класс, а не в одеяло, включая все файлы модели - это сэкономило около 1 мс на файл, включая , Поэтому, если рендеринг страницы составляет 80 мс, и вы можете сэкономить 20 мс, включив только то, что вам нужно, даже с APC (когда их много), это может стоить того. Также потребовалось всего 10 минут для реализации. – codercake

1

Существует, безусловно, влияние, поэтому обязательно используйте include_once() вместо include(). Возможно, вам стоит рассмотреть возможность использования APC с кешем include.

+0

ggiroux ... спасибо ... как насчет того, когда файл кэшируется? Если это не глупый вопрос. – Tom

+1

если он кэширован, я бы сказал, что воздействие очень минимальное, поскольку оно будет храниться в предварительно скомпилированном байт-коде в общей памяти. – ggiroux

+3

include_once() вместо include()? Пожалуйста, расширьте это; это, конечно, не добавляет скорости использования include_once по причинам, уже упомянутым в этой теме. – Slavic

16

Будьте осторожны с include_once() (а также require_once()), дороже, чем include(). Каждый раз, когда выполняется include_once(), PHP выполняет поиск по внутреннему индексу уже включенных файлов, прежде чем принимать решение о загрузке файла или нет. Чем больше в индексе, тем медленнее этот поиск. Также при использовании include() или include_once() попытайтесь использовать абсолютные пути, если это возможно, поскольку это намного быстрее, чем относительные пути, потому что вы не заставляете PHP выработать абсолютный путь для вас. Как сказал ggiroux, некоторая форма кэширования, такая как APC, принесет огромные награды и заставит вас беспокоиться о том, сколько из них включает вызовы, которые у вас неактуальны (в основном) (если у вас нет плохо написанного кода).

EDIT--

Беспокоясь о вышеуказанных вызовов только вопрос, как только вы начать иметь несколько тысяч requires или includes в вашем коде.

+0

В Интернете каждые 100 мс подсчитывается. Вам не нужно тысячи включений, чтобы извлечь из этого пользу. – Pacerier

+0

Что вы думаете об этом странном сообщении: https://seeit.org/2010/06/11/php-the-include-include_once-performance-debate/, который утверждает, что ** include_once() ** на самом деле быстрее, чем **включают()**? – Adam

Смежные вопросы