Кэширование кода операции PHP / ускорение Zend и include_once против require_once

У меня есть коллега, который изучает кеширование опкодов / Zend Acceleration (я всегда предполагал, что это одно и то же) для нашего приложения на основе PHP. Его тесты показывают, что мы НЕ видим увеличения производительности, если мы включаем наши (большие) библиотеки классов с помощью require_once, но мы ДЕЙСТВИТЕЛЬНО видим выигрыш в производительности при использовании include_once.

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

Кто-нибудь когда-нибудь сталкивался с чем-то подобным? Если нет, то какие мысли о других вещах, которые могут вызвать увеличение производительности при переключении с include_once на require_once?


person Alan Storm    schedule 16.10.2008    source источник


Ответы (2)


Для начала, оба вызова (require_once и include_once) дважды проверяют, не был ли файл включен ранее.

Таким образом, они оба достигают этого путем поиска файла по всем доступным путям и, по сути, проверки того, не был ли он в миксе раньше и т. Д.

В фоновом режиме происходит то, что они оценивают все различные параметры (например, несколько include_path и т. Д.), А затем, создавая realpath из этой сокращенной формы, они создают уникальный идентификатор. Есть только один и тот же путь, а не два.

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

Поправьте меня, если я ошибаюсь, но в APC есть оптимизация специально для этого случая.

Так или иначе - теперь о разнице между require_once и include_once, которая заключается в том, что require_once оценивает файл (на предмет низкоуровневых ошибок синтаксического анализа и т. Д.), Когда он включает его. Это дополнительная проверка, от которой вы можете избавиться, если у вас достаточно QA, чтобы ошибка синтаксического анализа никогда не могла проникнуть во включение.

Иначе найти сложно. :-)

(Что следует учитывать: вы можете разработать с помощью require_once и заменить все вызовы на include_once при развертывании.)

Что касается кеша кода операции - я бы порекомендовал APC. Ранее это обсуждалось в stackoverflow. Лично я / мы используем его какое-то время (мы обрабатываем примерно 100 тыс. Посетителей в день с 3 интерфейсами и 1 сервером), и мы очень довольны. APC также оптимизирован для безумия require_once / include_once.

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

Пара дополнительных указателей:

  1. Многие утверждают, что можно ускорить любое приложение с помощью __autoload.
  2. С кешем кода операции избегайте условного require_once / include_once (например, в циклах или в потоке управления).
  3. Некоторые люди говорят, что /absolute/path/to/file.php в include_ или require_once быстрее, чем полагаться на include_path.
  4. Порядок путей в вашем include_path также имеет значение.

Надеюсь, это поможет.

person Till    schedule 17.10.2008
comment
если у тебя достаточно QA ... ты довольно забавный;) - person Alan Storm; 17.10.2008
comment
Я только что протестировал require () vs. require_once () в цикле из 100 итераций. Включенный файл определяет небольшой класс с 1 методом. При использовании require родительский скрипт запускается за 0,02 секунды. При использовании require_once для запуска родительского скрипта требуется 0,005 секунды. Тем не менее, немногие сценарии когда-либо будут включать в себя достаточно файлов, чтобы что-то изменить. По сути, это ПОСЛЕДНЯЯ оптимизация, о которой нам нужно беспокоиться. - person dirtside; 20.06.2009

Я не могу ничего гарантировать, так как я не изучал это достаточно глубоко, но да, я видел разницу в скорости между ними. Однако они никогда не были достаточно значительными для меня, чтобы перейти на include_once вместо require_once.

Я всегда предполагал, что разница заключалась в том, что require_once должен выполнять больше работы под водой. по крайней мере, еще одна потенциальная ошибка, которую нужно подготовить и обработать, и многое другое, что нужно сделать, когда требуемый файл не существует.

person Kris    schedule 16.10.2008