PHP 8.5.10 готовится к выпуску — исправлены JIT, DOM, PDO и переполнения стека

PHP 8.5.10 запланирован к выпуску на 27 августа 2026 года, а финальные Windows-сборки и исходный ZIP уже появились на официальном сервере PHP 25 августа. На момент подготовки материала 26 августа официальный анонс ещё не опубликован: php.net по-прежнему указывает PHP 8.5.9 как актуальную стабильную версию, поэтому 8.5.10 пока корректнее считать подготовленным к релизу обновлением.

PHP 8.5.10 готовится к выпуску
PHP 8.5.10 готовится к выпуску

Финальные сборки уже размещены на сервере PHP

Подготовка PHP 8.5.10 фактически вышла на финальную стадию. В официальном каталоге Windows-сборок PHP 25 августа появились пакеты php-8.5.10 для x64 и x86, варианты Thread Safe и Non Thread Safe, debug-пакеты, development package, тестовый набор и архив исходного кода.

Одновременно файл NEWS ветки PHP 8.5 уже содержит отдельный раздел 27 Aug 2026, PHP 8.5.10 с перечнем исправлений. Это указывает на подготовленный состав релиза и запланированную дату публикации — 27 августа.

Есть важная оговорка. На главной странице PHP 26 августа последней стабильной версией ветки 8.5 всё ещё указана PHP 8.5.9 от 30 июля. Официального сообщения «PHP 8.5.10 Released» пока нет, поэтому появление файлов на сервере не следует путать с завершённым публичным релизом.

Для администраторов это означает, что обновление уже можно включать в ближайший план развёртывания и тестирования, но автоматическую установку в production до официального объявления разумно не форсировать.

Core и DOM защищены от нескольких переполнений стека

Заметная часть PHP 8.5.10 посвящена ситуациям, в которых специально сформированные или просто необычно глубокие структуры могли приводить к аварийному завершению процесса из-за переполнения стека.

В ядре исправлен GH-23088: сравнение глубоко вложенных массивов могло закончиться stack overflow. Ещё одно исправление, GH-22782, устраняет сбой при работе с first-class callable в константном выражении при использовании preloading.

Похожий класс ошибок устранён в DOM:

  • DOMDocument::normalize() больше не должен падать на чрезмерно глубоко вложенном документе;
  • аналогичная защита добавлена для Dom\XMLDocument::normalize();
  • DOMNode::isEqualNode() исправлен для сравнения глубоко вложенных DOM-деревьев;
  • DOMElement::setAttribute() теперь корректнее работает, когда DTD задаёт значение атрибута по умолчанию.

Практически эти изменения важнее всего для приложений, которые разбирают XML или HTML из внешних источников. Даже если приложение само не создаёт глубоко рекурсивные структуры, такой вход может прийти через импорт документов, API, очереди обработки данных или пользовательские загрузки.

Кроме того, exif_read_data() больше не должен выделять HEIF meta box размером больше самого исходного файла. Исправление относится к обработке метаданных изображений и снижает риск некорректного расходования памяти на повреждённых или необычно сформированных HEIF-файлах.

JIT получил сразу несколько исправлений

В PHP 8.5.10 исправляется несколько дефектов Opcache/JIT, затрагивающих как корректность генерируемого машинного кода, так и особенности его размещения на x86_64.

В список вошли:

  • GH-22693 — устранение DT_TEXTREL при JIT-генерируемом доступе к TLS на x86_64;
  • GH-22763 — JIT не очищал ZREG_TYPE_ONLY после назначения регистра;
  • GH-22857 — Function JIT мог генерировать некорректный код для FETCH_OBJ_FUNC_ARG при работе с getter-хуком свойства и терять переменные, находившиеся в регистрах;
  • GH-22916 — исправлено сохранение родительских регистров в zend_jit_deoptimizer_start().

Для большинства PHP-приложений эти изменения не дают новых возможностей и не меняют API. Их ценность в другом: если Opcache JIT включён в production или используется в вычислительно нагруженных сервисах, обновление уменьшает вероятность редких падений и неправильного выполнения кода в специфических ветках оптимизатора.

Такие дефекты особенно неприятны тем, что могут проявляться только при определённой комбинации кода, оптимизации и состояния JIT. Поэтому воспроизвести их на тестовой среде зачастую сложнее, чем обычную ошибку пользовательского PHP-кода.

PCRE запрещает \C в UTF-8-шаблонах

PHP 8.5.10 меняет поведение PCRE для одной потенциально проблемной конструкции. Исправление GH-21134 устраняет падение при использовании \C в UTF-8-шаблонах: теперь эта escape-последовательность в таком режиме запрещена.

\C в PCRE сопоставляет отдельную кодовую единицу независимо от границ символа. В UTF-8 это может разрезать многобайтовый символ, из-за чего комбинация исторически считалась опасной для ряда внутренних операций движка регулярных выражений.

Для большинства приложений изменение останется незаметным. Но проекты со сложными собственными регулярными выражениями, особенно для бинарно-текстовых протоколов или низкоуровневого анализа UTF-8, стоит проверить отдельно. Если код полагался на \C внутри UTF-8-паттерна, после обновления такой шаблон потребуется переписать.

В MBString также исправлены две ошибки:

  • mb_strrpos() возвращал неверную позицию при отрицательном смещении в кодировках, отличных от UTF-8;
  • mb_ereg_search_getregs() мог аварийно завершать процесс после того, как вызов mb_eregi() инвалидировал кэш регулярных выражений.

PDO_PGSQL и PDO_ODBC исправляют ошибки выборки данных

Существенный набор исправлений относится к драйверам баз данных. Для PDO_PGSQL устранено сразу несколько дефектов режима ленивой выборки с PDO::ATTR_PREFETCH => 0.

Согласно NEWS, ранее возможны были:

  • бесконечный цикл при очистке выборки, оставшейся в состоянии COPY;
  • use-after-free при уничтожении statement с эмулированными либо отключёнными prepared statements;
  • соединение могло оставаться занятым перед следующей выборкой;
  • строки результата могли быть получены не тем statement, который должен был ими владеть.

Это не типичный режим для каждого PHP-проекта, но для приложений, работающих с большими результатами PostgreSQL и контролирующих предварительную выборку, исправления напрямую влияют на стабильность соединений и корректность результата.

В PDO_ODBC исправлен GH-23016: значения NULL в длинных колонках могли возвращаться как мусорные бинарные строки. Для систем, интегрирующихся через ODBC с внешними СУБД или корпоративными источниками данных, это уже вопрос не только стабильности, но и корректной интерпретации данных приложением.

Сессии, потоки и XML получили исправления работы с памятью

PHP 8.5.10 устраняет несколько ошибок, которые могли приводить к повреждению памяти, use-after-free или segfault.

В Session исправлено повреждение данных в mod_mm, а GH-23043 закрывает ситуацию, при которой некорректный код идентификатора сессии мог привести к сообщению zend_mm_heap corrupted.

В Streams устранён use-after-free, возникавший, если пользовательский stream filter обращался к $this->stream во время финального flush при закрытии потока.

В XSL исправлен use-after-free, связанный с клонированием подкласса DOMDocument, если __clone() сохранял копию stylesheet, созданную XSLTProcessor::importStylesheet().

SimpleXML получил исправление segfault при сравнении неинициализированных экземпляров SimpleXMLElement, а расширение Sockets — несколько исправлений, связанных с памятью, и более корректные сообщения валидации для параметров UDP_SEGMENT и SO_LINGER.

В SQLite закрыта утечка памяти при попытке закрыть базу, пока blob stream остаётся открытым. В OpenSSL добавлена недостающая проверка ошибки для некорректных ALPN-протоколов.

Рекурсивные функции стандартной библиотеки стали устойчивее

Ещё три исправления касаются стандартных функций PHP, работающих с вложенными массивами. В текущем NEWS для PHP 8.5.10 перечислены stack overflow в:

  • array_walk_recursive();
  • array_replace_recursive();
  • compact() при обработке глубоко вложенных структур.

Это продолжает ту же линию, что и исправления Core и DOM: PHP жёстче обрабатывает патологически глубокие структуры вместо того, чтобы аварийно завершать процесс из-за исчерпания стека.

Для backend-сервисов это особенно актуально там, где массивы строятся из внешних JSON-, XML- или сериализованных данных. Само обновление не заменяет ограничения глубины входных данных на уровне приложения, но уменьшает число сценариев, в которых необычная структура приводит к падению PHP-процесса.

Чем PHP 8.5.10 отличается от 8.5.9

PHP 8.5.9, выпущенный 30 июля, был официально обозначен как security release и включал исправления CVE в BCMath, PGSQL, Phar и обновление libgd с закрытием CVE. В текущем разделе NEWS для PHP 8.5.10 отдельных CVE не указано.

ВерсияСтатусОсновной акцент
PHP 8.5.9Выпущена 30 июля 2026 годаSecurity release, несколько исправлений CVE, JIT, ODBC, Phar и других компонентов
PHP 8.5.10Запланирована на 27 августа 2026 годаИсправления стабильности Core, DOM, JIT, PDO, Session, PCRE, MBString, Streams и XSL

Из этого не следует, что PHP 8.5.10 можно игнорировать. В релизе присутствуют use-after-free, повреждение heap, segfault и переполнения стека — классы ошибок, которые сами по себе достаточно серьёзны для серверного окружения, даже если на момент подготовки материала им не присвоены CVE.

Состав NEWS ещё теоретически может измениться до официальной публикации 27 августа, поэтому финальную классификацию релиза и список исправлений стоит сверить с официальным анонсом после его выхода.

Кому стоит готовиться к обновлению

PHP 8.5 находится в фазе активной поддержки: по официальному графику поддержки ветка получает обычные исправления ошибок и безопасности до 31 декабря 2027 года, а критические security-fixes — до конца 2029 года.

Для серверов на PHP 8.5 обновление до 8.5.10 выглядит плановым, но полезным техническим релизом. Наибольший приоритет он имеет для систем, где используются:

  • Opcache JIT;
  • DOM, SimpleXML или XSL для обработки внешних документов;
  • PostgreSQL через PDO_PGSQL, особенно с PDO::ATTR_PREFETCH => 0;
  • ODBC-драйверы и длинные nullable-поля;
  • собственные stream filters;
  • сложные регулярные выражения PCRE в UTF-8;
  • MBString с многобайтовыми кодировками;
  • обработка HEIF/EXIF из внешних файлов.

Перед развёртыванием стоит отдельно прогнать набор тестов для регулярных выражений: запрет \C в UTF-8-паттернах — одно из немногих изменений 8.5.10, которое способно проявиться не как исправление прозрачной внутренней ошибки, а как заметное изменение поведения существующего приложения.

Резюме

PHP 8.5.10 — не функциональный релиз с новым синтаксисом или API, а крупный пакет исправлений стабильности для уже поддерживаемой ветки 8.5. Он закрывает несколько сценариев переполнения стека, ошибки Opcache JIT, проблемы ленивой выборки PostgreSQL, повреждение памяти в сессиях, сбои MBString и PCRE, а также ряд дефектов DOM, Streams, XSL и других расширений.

На 26 августа обновление ещё не следует называть официально выпущенным: финальные файлы появились на сервере PHP 25 августа, но NEWS указывает дату 27 августа, а главная страница проекта пока предлагает PHP 8.5.9 как текущую стабильную версию. Для production разумный порядок действий — подготовить тестирование сейчас и устанавливать 8.5.10 после официального объявления и публикации финального changelog.

При использовании материалов сайта необходимо указывать ссылку на TGLand.ru. Если вы копируете фрагменты текста в интернете, прямая гиперссылка, доступная для индексации поисковыми системами, должна быть размещена в начале материала.

Вам также может понравиться