Метка: zend engine

  • Внутреннее устройство PHP: глубокий разбор структуры zval

    Zval (Zend value) — фундаментальная структура данных в ядре PHP, ответственная за хранение и обработку всех переменных. В этой статье мы детально разберем её эволюцию и современную реализацию.

    Историческая эволюция

    Версия PHPРазмер zvalКлючевые изменения
    PHP 5.624 байтаУниверсальный подсчет ссылок, избыточность
    PHP 7.016 байтОптимизация хранения скаляров, новые флаги
    PHP 8.216 байтДополнительные оптимизации JIT

    Сравнение производительности

    // Тест создания 1 млн zval-ов (в нс)
    PHP 5.6: 2400 ns
    PHP 8.2: 800 ns (ускорение 3x)

    Структура zval в PHP 8

    struct _zval_struct {
        zend_value value;    // 8 байт (union)
        union {
            struct {
                zend_uchar type;        // Тип данных
                zend_uchar type_flags;  // Поведенческие флаги
                zend_uchar const_flags; // Константность
                zend_uchar reserved;    // Выравнивание
            } v;
            uint32_t type_info;         // Альтернативное представление
        } u1;                          // 4 байта
        union u2 {                     // 4 байта (служебные данные)
            uint32_t next;
            // ... другие поля
        };
    }; // Всего 16 байт

    Типы данных и их хранение

    • Скаляры (int, float, bool) — хранятся напрямую в zend_value
    • Строки — указатель на zend_string (отдельная структура в heap)
    • Массивы — указатель на HashTable
    • Объекты — указатель на zend_object

    Ключевые оптимизации

    1. Отказ от refcount для скаляров

    В PHP 7+ целые числа и булевы значения больше не используют подсчет ссылок, что устраняет накладные расходы на их копирование.

    2. Copy-On-Write для сложных структур

    $a = [1,2,3]; // Создается HashTable (refcount=1)
    $b = $a;      // Только увеличивается refcount
    $b[] = 4;     // Реальное копирование при изменении

    3. Встроенное кеширование хешей

    Строки хранят предвычисленные хеши, что ускоряет операции сравнения и поиска в хеш-таблицах.

    Практическое применение

    Для разработчиков расширений

    // Создание zval в расширении
    zval my_zval;
    ZVAL_LONG(&my_zval, 42);
    
    // Доступ к значению
    if (Z_TYPE(my_zval) == IS_LONG) {
        zend_long value = Z_LVAL(my_zval);
    }

    Оптимизации для веб-приложений

    • Используйте строгие типы (strict_types=1)
    • Избегайте избыточного копирования массивов
    • Освобождайте память unset() для больших структур

    Заключение

    • Zval в PHP 8 — высокооптимизированная структура
    • Понимание её устройства помогает писать эффективный код
    • Оптимизации PHP 7+ дают до 3x прирост производительности