Перейти к основному содержимому

OpCache и Just-In-Time (JIT) компиляция

1. Как работает OpCache?​

OpCache — это механизм кеширования для PHP, который повышает производительность за счёт хранения предварительно скомпилированного байт-кода скриптов в разделяемой памяти.

Жизненный цикл без OpCache:​

  1. Чтение: Интерпретатор PHP считывает файл .php с диска.
  2. Лексический анализ (Lexing/Tokenizing): Код преобразуется в токены.
  3. Парсинг (Parsing): Токены преобразуются в абстрактное синтаксическое дерево (AST).
  4. Компиляция: AST компилируется в опкоды (Operation Codes).
  5. Выполнение: Zend Engine выполняет опкоды.
  6. Освобождение ресурсов: Все ресурсы освобождаются по завершении запроса.

Жизненный цикл с OpCache:​

OpCache исключает шаги 1–4 для последующих запросов. После первой компиляции опкоды сохраняются в разделяемой памяти (RAM). При повторном обращении к тому же скрипту PHP сразу выполняет кешированные опкоды, что существенно снижает нагрузку на CPU и дисковый ввод-вывод.


2. Как OpCache работает начиная с версии 8.0 и новый JIT?​

Начиная с PHP 8.0, JIT реализован как практически независимая часть OpCache. Его можно включить или отключить как на этапе компиляции PHP, так и во время выполнения.

PHP JIT Chart

В PHP 8.0+ поток выполнения изменяется при включённом JIT:

  1. Проверка OpCache: Если опкоды уже находятся в разделяемой памяти, они извлекаются оттуда.
  2. Анализ JIT: Движок JIT отслеживает «горячий» код (код, который выполняется часто).
  3. Генерация машинного кода: Вместо простого выполнения опкодов через Zend VM, JIT-компилятор транслирует «горячие» опкоды непосредственно в нативный машинный код (x86 или ARM).
  4. Прямое выполнение: Процессор выполняет машинный код напрямую, минуя цикл интерпретатора Zend VM для соответствующих участков.

3. Что вы знаете о JIT?​

JIT расшифровывается как Just-In-Time (компиляция «точно в срок»). Это техника, при которой части кода компилируются во время выполнения, а не до начала исполнения.

Ключевые аспекты:​

  • Два режима: PHP 8.0 представил два режима JIT:
    • Function JIT: Компилирует целые функции. Проще в реализации, но менее эффективен.
    • Tracing JIT: (Режим по умолчанию / рекомендуемый) Определяет часто используемые пути выполнения (трассы) между функциями и компилирует их.
  • Влияние на производительность:
    • Для веб-приложений (ограничены вводом-выводом): JIT часто даёт незначительный прирост, поскольку узким местом обычно является база данных, сеть или файловая система.
    • Для CPU-интенсивных задач: JIT может обеспечить значительный прирост производительности (например, математические вычисления, обработка изображений, анализ данных).
  • Настройка: Управляется через opcache.jit и opcache.jit_buffer_size в php.ini.
  • Почему это важно: JIT открывает возможности для использования PHP за пределами веб-разработки — в машинном обучении или длительно работающих демонах с интенсивными вычислениями.