Zval (Zend value) — фундаментальная структура данных в ядре PHP, ответственная за хранение и обработку всех переменных. В этой статье мы детально разберем её эволюцию и современную реализацию.
Историческая эволюция
Версия PHP | Размер zval | Ключевые изменения |
---|---|---|
PHP 5.6 | 24 байта | Универсальный подсчет ссылок, избыточность |
PHP 7.0 | 16 байт | Оптимизация хранения скаляров, новые флаги |
PHP 8.2 | 16 байт | Дополнительные оптимизации 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 прирост производительности
Добавить комментарий