Что такое JIT-компиляция в PHP?

«Что такое JIT-компиляция в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JIT (Just-In-Time — компиляция «на лету») — это технология оптимизации, при которой участки байт-кода PHP компилируются в машинный код непосредственно во время выполнения скрипта. Она была представлена в PHP 8.0 и предназначена для ускорения CPU-интенсивных операций.

Как это работает в контексте PHP:

  1. Обычный поток: PHP-скрипт -> Токенизация -> Парсинг (AST) -> Компиляция в байт-код Opcache -> Интерпретация байт-кода Zend VM.
  2. С JIT: Часто исполняемые участки байт-кода из Opcache дополнительно компилируются в нативный машинный код, который процессор выполняет напрямую, минуя виртуальную машину.

Когда JIT даёт максимальный эффект:

  • Математические вычисления и числовые алгоритмы.
  • Обработка больших массивов в циклах.
  • Долго работающие CLI-скрипты и процессы (воркеры, демоны).
  • Синтетические бенчмарки (например, Mandelbrot, числовые ряды).

Настройка в php.ini:

opcache.enable=1
opcache.jit_buffer_size=100M ; Память под машинный код
opcache.jit=1255 ; Распространённый агрессивный режим

Значение 1255 расшифровывается:

  • 1 — включить JIT при старте.
  • 2 — профилирование на основе трассировки (более точное).
  • 5 — компилировать все функции при первом вызове.
  • 5 — уровень оптимизаций (максимальный).

Пример, где JIT может помочь:

// CPU-интенсивный цикл — кандидат для JIT-оптимизации
function calculateSum(int $n): int {
    $sum = 0;
    for ($i = 0; $i < $n; $i++) {
        $sum += $i * $i;
    }
    return $sum;
}

echo calculateSum(1_000_000);

Важные ограничения:

  • Нет эффекта для I/O-bound задач: Для типичных веб-запросов, где время уходит на работу с БД, кешем, внешними API, прирост от JIT минимален или отсутствует.
  • Накладные расходы: Сама компиляция в машинный код требует ресурсов. JIT выгоден, когда время выполнения скомпилированного кода многократно перекрывает эти затраты.
  • Требует Opcache: JIT работает только при включённом и корректно настроенном Opcache.

Таким образом, JIT — это мощный инструмент для узкого класса задач, а не «волшебная таблетка» для ускорения любого PHP-приложения.