Что такое кэш байт-кода и как я могу использовать его в PHP?

#php #caching #bytecode

#php #кэширование #байт-код

Вопрос:

Я искал в Интернете и узнал, что PHP-код может быть скомпилирован для повышения производительности. Но как это сделать? Могу ли я скомпилировать как процедурный, так и объектно-ориентированный PHP-код?

Ответ №1:

Основная идея, при выполнении PHP-скрипта выполняется в два этапа :

  • Первое: PHP-код, написанный в виде обычного текста, компилируется в opc-коды
  • Затем: эти коды операций выполняются.

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

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

Как только PHP-скрипт будет скомпилирован в opc-коды, они будут сохранены в оперативной памяти — и будут использоваться непосредственно из памяти при следующем выполнении скрипта; предотвращая повторную компиляцию.

Наиболее часто используемый кэш кода операции — это APC — альтернативный кэш PHP :

После того, как APC установлен и настроен должным образом, вам ничего не нужно изменять в вашем PHP-коде: APC будет кэшировать коды операций, и это все — процесс полностью невидим для вашего приложения.

Комментарии:

1. таким образом, это сценарий, полностью отличающийся от C / C … где мы пишем код в файле .c, компилируем в .exe и запускаем этот exe-файл! что насчет этого случая?

2. Да, это совершенно другая идея: C / C — это скомпилированные языки, в то время как PHP больше относится к интерпретируемому типу ;;; если вы хотите скомпилировать свой PHP-код в какой-то исполняемый файл, вы могли бы взглянуть на HipHop ( github.com/facebook/hiphop-php/wiki ) — но обратите внимание, что это, как правило, не совсем необходимо (На самом деле я никогда не видел, чтобы кто-нибудь использовал HipHop на производственном сервере — за исключением facebook, конечно… Но так ли важен ваш сайт?)

3. нет, никогда не нравилось Facebook :), но могу ли я использовать APC в моем PHP-коде из 13000 строк, который написан в процедурном стиле?

4. было бы лучше, если бы вы просто привели простой пример того, как использовать APC

5. Да, вы можете использовать APC (ваш код не имеет значения) ; просто установите расширение, отредактируйте свой php.ini, чтобы включить его и настроить; перезапустите Apache, чтобы изменения были учтены ; и вуаля; вам больше ничего не нужно делать.

Ответ №2:

Но как это сделать?

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

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

 $timer_start = microtime(1);
  

и эта строка в самом конце:

 echo "Generated in ".(round((microtime(1) - $timer_start),4))." sec.";
  

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

Комментарии:

1. пожалуйста, объясните немного больше, и было бы лучше, если бы вы могли дать немного PHP-кода!

2. Это долгая история. Короче говоря, вы должны быть уверены, действительно ли вам нужен код операции. 99,99% сайтов в мире не используют его, поскольку для них это просто бесполезно.

3. Это довольно смелое утверждение. Большинство людей не используют APC просто потому, что они находятся на общем хостинге и, следовательно, не могут им пользоваться. Но, насколько я знаю, практически любой пользователь виртуального или выделенного хостинга использует APC. Есть множество вещей, которые не улучшат производительность ваших сайтов, но APC — это то, что определенно улучшает (измеримо только Google).