Основы кэширования кода операции PHP - PullRequest
2 голосов
/ 23 сентября 2009

В настоящее время в очень большом проекте, который я не планирую повторно использовать для другого сайта, у меня везде есть имя сайта, жестко запрограммированное в файлах. Теперь, если бы я когда-либо сменил имя сайта, потребовалось бы много усилий, чтобы изменить это везде. Я знаю, что очевидное решение состоит в том, чтобы просто сохранить имя как переменную или константу, но я думаю, вы могли бы назвать это моим микрооптимизирующим мышлением: я всегда думал, что PHP разберет на одну вещь меньше. Я понимаю, что это не будет иметь большого значения, но я просто хотел знать, будет ли использование кеша кода операции, такого как APC, означать, что PHP даже не придется его пересматривать?

Ответы [ 2 ]

6 голосов
/ 23 сентября 2009

На самом деле: вас не должно волновать что-либо подобное.

Любая разница в конфигурации будет означать много больше разницы (например, опция apc.stat для APC может сильно повлиять на нагрузку на ваш сервер - и все, что угодно Ваши запросы к БД будут иметь в сотни раз большее влияние)

Здесь, вероятно, имеет значение ремонтопригодность:

  • приносит ли вам какую-либо выгоду (кроме этой нано-оптимизации) , если имя сайта не будет жестко задано?
  • дает ли вам какое-либо преимущество, если его жестко закодировать (то же исключение) ?

Если ответ «нет» в любом случае, и ваше приложение работает ... ну, вот что важно!


Если у вас есть время, чтобы потратить на такого рода оптимизацию, не связанную с микрооптимизацией, возможно, было бы лучше потратить время на просмотр кода приложения с помощью профилировщика, на выполнение запросов к БД, на количество запросов HTTP, которые вы выполняете для извлечения статических JS / CSS. / images, обновление PHP или изменение кода, чтобы он мог работать на PHP 5.3 (так как PHP 5.3 поставляется с некоторыми оптимизациями по сравнению с 5.2) , ...

Скорее всего, все это принесет вам больше выгоды; -)


Редактировать после комментария:

Обычно при загрузке файла PHP:

  • файл читается с диска
  • он анализируется и компилируется в код операции
  • коды операций выполнены

С кешем кода операции:

  • если в ОЗУ есть место, содержащее коды операций, они загружаются из ОЗУ (нет чтения файла, синтаксического анализа / компиляции)
    • , если нет, см. Шаги перед этим - просто добавьте «сохранить коды операций в ОЗУ» перед выполнением для следующего запроса
  • и коды операций выполнены

Опция apc.stat определяет, должен ли APC проверять дату / время последнего изменения файла, чтобы выбрать между использованием кодов операций из ОЗУ или повторной компиляцией файла, если он более поздний, чем коды операций в ОЗУ.

Отключение этой опции означает:

  • файлы не проверяются на диске => быстрее и используют меньше ресурсов
    • Например, я видел падение загрузки ЦП, между 10 и 15%, при отключении этой опции на довольно загруженном сервере
  • но поскольку нет проверки на изменение, если вы хотите, чтобы изменение было учтено, вы должны очистить кеш


Тем не менее, то, что я сказал, верно: есть, вероятно, лотов вещей, которые вы можете оптимизировать, что будет означать более важный выигрыш, чем простое «если я использую жестко закодированные значения» по сравнению с «если я буду использовать константы / переменные» .

2 голосов
/ 09 мая 2014

это именно то, что происходит .. не вдаваясь в детализацию уровня токена ...

PHP - это язык сценариев, который большинство людей подразумевает, что он не компилируется. Хотя это верно в традиционном смысле в том смысле, что мы не называем gcc или javac; вместо этого мы компилируем каждый раз, когда запрашивается скрипт. Фактически, жизненные циклы компиляции PHP и Java очень похожи, потому что они оба компилируются в промежуточный набор команд (коды операций или байтовые коды), которые затем запускаются на виртуальной машине (Zend VM или JVM).

enter image description here

Фазы синтаксического анализа и компиляции медленные. Когда мы добавляем opcache, мы закорачиваем этот процесс, сохраняя результаты этапов синтаксического анализа и компиляции, оставляя только выполнение для динамического выполнения, как всегда. По сути, мы сейчас ближе к жизненному циклу Java; основные отличия заключаются в том, что мы сохранили в общую память вместо файла и можем автоматически перекомпилироваться, если в скрипте происходят изменения.

enter image description here

Использовать кэш кода операции. Это даст вам больше прироста производительности, чем любая микрооптимизация. Кроме того, при использовании Zend OpCache для вас выполняется много оптимизаций (например, переключение $ i ++ на ++ $ i, когда возвращаемое значение не используется).

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

...