← Назад к вопросам

За счет чего ускорился PHP в новых версиях PHP?

1.7 Middle🔥 112 комментариев
#PHP Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

За счет чего ускорился PHP в новых версиях?

Современные версии PHP (особенно с 7.x и далее) демонстрируют значительный рост производительности по сравнению с PHP 5.x. Этот рост, часто достигающий 2-3 раз в реальных приложениях, обусловлен комплексной переработкой ядра языка. Основные улучшения можно разделить на несколько ключевых направлений.

1. Полная переработка внутренней структуры Zend Engine — внедрение Zend Engine 3

Это самое фундаментальное изменение. В PHP 7 была заменена архитектура внутреннего представления данных и управления памятью.

  • Новая система значений — zval. В PHP 5 zval (структура, представляющая любое значение в PHP) был тяжеловесным, хранил много служебной информации и использовал много косвенных ссылок (indirect pointers). В PHP 7 zval стал значительно более компактным и эффективным.
    // Упрощенная концепция: в PHP 7 zval часто хранит значение напрямую,
    // а не через дополнительный указатель на структуру.
    struct _zval_struct {
        zend_value value;        // Само значение (union для разных типов)
        union {
            struct {
                zend_uchar type; // Тип данных
                // ... меньше служебных полей
            } v;
        } u1;
    };
    
  • Снижение количества аллокаций памяти и операций с ссылками. Поскольку значения стали храниться более прямо, уменьшилось количество мелких выделений памяти и манипуляций с указателями, что особенно важно для массовых операций в циклах.
  • Оптимизация работы со строками (interned strings). Часто используемые строки (например, названия функций, классы, константы) теперь хранятся в общем пуле и не дублируются в памяти.

2. Введение абстрактного синтаксического дерева (AST) на этапе компиляции

В PHP 5.x код после парсинга напрямую превращался в opcodes (инструкции для Zend VM). В PHP 7 между парсингом и генерацией opcodes появился промежуточный этап — построение AST.

// Пример простого кода
$a = 10 + 5 * 2;
  • PHP 5: Парсер -> напрямую в последовательность opcodes (например, MUL, ADD, ASSIGN).
  • PHP 7: Парсер -> AST (дерево, где * будет вложено в +) -> оптимизации на уровне дерева -> генерация opcodes.
  • Преимущество: AST позволяет выполнять статические оптимизации до генерации кода. Например, упрощение константных выражений (10 + 5 * 2 вычисляется сразу в 20), анализ и оптимизация ветвлений, более эффективная компоновка инструкций. Это сокращает объем работы, которую должен выполнять виртуальная машина во время исполнения.

3. Улучшения в виртуальной машине и генерации opcodes

Сама Zend Virtual Machine, которая исполняет opcodes, была серьезно оптимизирована.

  • Специализированные opcodes. Добавлены более эффективные инструкции для частых операций.
  • Улучшенная диспетчеризация (dispatching). Механизм перехода между выполнением очередных opcodes стал быстрее.
  • Оптимизация работы с массивами. Операции с массивами, которые являются центральной структурой данных в PHP, стали значительно эффективнее благодаря переработке их внутренней реализации (HashTable).

4. Поддержка JIT-компиляции (в PHP 8)

В PHP 8 был введен экспериментальный, а затем и стабильный JIT (Just-In-Time компилятор). Это позволило выйти за рамки оптимизации исполнения opcodes.

  • Принцип работы: Горячие участки кода (часто исполняемые циклы, математические операции) не просто исполняются виртуальной машиной как последовательность opcodes, а динамически компилируются в настоящий машинный код для конкретного процессора.
// Код с интенсивными вычислениями
function calculate() {
    $sum = 0;
    for ($i = 0; $i < 1000000; $i++) {
        $sum += $i * $i;
    }
    return $sum;
}
// При частом вызове JIT может скомпилировать этот цикл в машинный код,
// устраняя накладные расходы интерпретации каждой opcode.
  • Эффект: JIT особенно сильно ускоряет "синтетический" код — числовые вычисления, бенчмарки. В реальных веб-приложениях его влияние может быть менее выраженным (так как там много работы с I/O, памятью, шаблонами), но в определенных сценариях он дает дополнительный прирост.

5. Многочисленные мелкие оптимизации во всем ядре

  • Более эффективные функции. Переписанные на C внутренние функции для работы со строками, массивами, математикой.
  • Оптимизация передачи параметров. Уменьшение накладных расходов при вызове функций.
  • Улучшенное управление памятью. Более эффективное использование кэшей, снижение fragmentation.

Сводка результатов

  • PHP 7.0: Основной скачок (~2x скорость) благодаря Zend Engine 3 и AST.
  • PHP 7.1 - 7.4: Дополнительные постепенные улучшения VM и отдельных компонентов.
  • PHP 8.0: Новые возможности (JIT, атрибуты) и дальнейшие оптимизации, особенно для типизированных сценариев.
  • PHP 8.1, 8.2, 8.3: Постоянная работа над производительностью: оптимизация наследования, кэширование информации о классах, улучшения для enum, readonly свойств и т.д.

Таким образом, ускорение — это не результат одной "серебряной пули", а следствие глубокого, системного рефакторинга ядра языка, направленного на снижение накладных расходов на каждом уровне: от парсинга и представления данных до непосредственного исполнения.

За счет чего ускорился PHP в новых версиях PHP? | PrepBro