Другие изменения

Изменения в ядре

Ядро PHP

Время высокого разрешения (hrtime()) в macOS теперь использует рекомендуемый clock_gettime_nsec_np(CLOCK_UPTIME_RAW) API вместо mach_absolute_time().

CGI/CLI

Опция -z или --zend-extension удалена, так как не функционировала. Вместо неё используйте -d zend_extension=[path].

PDO_ODBC

Изменено поведение при извлечении данных из больших столбцов. Вместо извлечения блоков по 256 байт PDO_ODBC будет пытаться извлекать блоки большего размера; в настоящее время это размер страницы за вычетом накладных расходов на строку. Драйверы, которые возвращают SQL_NO_TOTAL в SQLGetData, также обрабатываются лучше.

Изменения в модулях SAPI

CLI

Попытка установить слишком длинное название процесса с помощью функции cli_set_process_title() теперь приведёт к ошибке, а не к молчаливому усечению заданного названия.

Добавлена новая опция --ini=diff для вывода INI-настройки, отличной от установленной по умолчанию.

FPM

FPM с httpd ProxyPass опционально декодирует полный путь к скрипту. Добавлена INI-настройка fastcgi.script_path_encoded, чтобы предотвратить обновлённое поведение.

Ограничение журнала доступа FPM теперь учитывает значение log_limit.

Изменённые функции

Функции интернационализации

Функция grapheme_extract() правильно присваивает значение $next при пропуске недопустимых начальных байтов. Ранее были случаи, когда значение параметра указывало на начало границы графема, а не на конец.

Из сигнатуры функций transliterator_get_error_code(), transliterator_get_error_message(), TransLiterator::getErrorCode() и TransLiterator::getErrorMessage() убрано возвращаемое значение false. Возвращение значения false на самом деле никогда не было возможным.

Следующие функции теперь поддерживают параметр $locale: grapheme_strpos(), grapheme_stripos(), grapheme_strrpos(), grapheme_strripos(), grapheme_substr(), grapheme_strstr() и grapheme_stristr().

Функции LDAP

Функция ldap_get_option() теперь принимает соединение null, как и функция ldap_set_option(), чтобы обеспечить возможность извлечения глобальных опций.

Функции libxml

Тип возвращаемого значения функции libxml_set_external_entity_loader() изменён на true.

Функции OpenSSL

Добавлен новый параметр $digest_algo функциям openssl_public_encrypt() и openssl_private_decrypt(), который позволяет указать алгоритм хеширования для заполнения OAEP.

Добавлен новый параметр $padding функциям openssl_sign() и openssl_verify(), openssl_sign() and openssl_verify() have a new parameter $padding, который позволяет использовать более безопасную подкладку RSA PSS.

Параметр $cipher_algo функции openssl_cms_encrypt() может быть строкой с именем шифра. Это позволяет использовать больше алгоритмов, включая алгоритмы шифрования AES GCM для данных с авторизацией.

Функции PCNTL

Тип возвращаемого значения функции pcntl_exec() изменён на false.

Функция pcntl_waitid() принимает дополнительный аргумент resource_usage для сбора различных платформенных метрик о дочернем процессе.

Функции PDO_PGSQL

Метод Pdo\Pgsql::copyFromArray() теперь поддерживает входные данные типа iterable.

Метод Pdo\Pgsql::setAttribute() и Pdo\Pgsql::prepare() поддерживают установку значения PDO::ATTR_PREFETCH в 0, что переводит систему в режим отложенной выборки. В этом режиме операторы не могут выполняться параллельно.

Функции PostgreSQL

Функция pg_copy_from() теперь поддерживает входные данные типа iterable.

Функция pg_connect() проверяет, содержит ли аргумент connection_string нулевой байт.

Функция pg_close_stmt() проверяет, содержит ли аргумент statement_name нулевой байт.

Функции POSIX

Функция posix_ttyname() устанавливает last_error в EBADF при обнаружении некорректного файлового дескриптора.

Функция posix_isatty() выдаёт ошибку уровня E_WARNING при обнаружении некорректного файлового дескриптора.

Функция posix_fpathconf() проверяет некорректные файловые дескрипторы, устанавливает last_error в EBADF и выдаёт ошибку уровня E_WARNING.

Функции интроспекции кода Reflection

Вывод метода ReflectionClass::__toString() для перечислений изменён, чтобы лучше показать, что класс является перечислением, а элементы перечисления являются именно элементами перечисления, а не обычными константами класса.

Вывод метода ReflectionProperty::__toString() для свойств с хуками изменён, чтобы указать, у каких хуков есть свойство, являются ли эти хуки окончательными и является ли свойство виртуальным. Это также влияет на вывод метода ReflectionClass::__toString(), когда класс содержит свойства с хуками.

Функции Sockets

Функции socket_create()/socket_bind() могут создавать сокеты семейства AF_PACKET.

Функция socket_getsockname() получает индекс интерфейса и его строковое представление с помощью сокета AF_PACKET.

Функции Zlib

Параметр $use_include_path функций gzfile(), gzopen() и readgzfile() изменён с целого числа (int) на логическое значение (bool).

Функции gzfile(), gzopen() и readgzfile() теперь учитывают контекст потока по умолчанию.

Другие изменения в модулях

Модуль cURL

Функция curl_setopt() со значением опции CURLOPT_FOLLOWLOCATION больше рассматривается не как логическое значение, а как целое число для обработки CURLFOLLOW_OBEYCODE и CURLFOLLOW_FIRSTONLY.

Модуль Fileinfo

Обновлён файл с версии 5.45 до 5.46.

Тип возвращаемого значения функции finfo_close() был изменён на true вместо bool.

Модуль интернационализации

Внутренний механизм ошибок Intl был модернизирован, чтобы более точно указывать, какой участок кода вызвал ту или иную ошибку. Кроме того, некоторые исключения ext/date теперь заключены в IntlException.

Модуль Lexbor

Добавлен всегда включенный модуль lexbor. Он содержит библиотеку lexbor, которая была отделена от ext/dom для повторного использования в других модулях. Новый модуль не доступно напрямую пользователям.

Модуль Opcache

Модуль Opcache теперь всегда встроен в бинарный файл PHP и всегда загружается. INI-директивы opcache.enable и opcache.enable_cli по-прежнему соблюдаются.

Модуль PCRE

Обновлена библиотека pcre2lib с версии 10.44 до 10.46.

Модуль PDO_Sqlite

Увеличена поддержка минимальной версии с 3.7.7 до 3.7.17.

Модуль Readline

Функции readline_add_history(), readline_clear_history() и readline_callback_handler_install() теперь возвращают конкретный тип true вместо общего bool.

Модуль интроспекции кода Reflection

С класса ReflectionConstant сняли модификатор final.

Изменения обработки INI-файла

Ядро PHP

В файлы конфигурации добавили директиву fatal_error_backtraces. Директива определяет, требуется ли включать в сведения о критических ошибках обратную трассировку.

В INI-файлы добавили директиву max_memory_limit. Директива определяет границу, превышение которой при установке значения memory_limit спровоцирует предупреждение и установит директиве memory_limit текущее значение max_memory_limit, если только для max_memory_limit не установили значение -1, которое снимает ограничение. Значение новой директивы невозможно изменить после запуска PHP, тогда как значение memory_limit доступно для изменения и в конфигурации, и на этапе выполнения программы.

Модуль Opcache

Добавили директиву opcache.file_cache_read_only. Директива переводит работу с каталогом кеша второго уровня, на который указывает директива opcache.file_cache, в режим только для чтения. Директиву включают, например, для работы с Docker-контейнерами, внутри которых файловую систему смонтировали в режиме только для чтения. Для уменьшения количества дисковых операций и снижения нагрузки на ЦП при включении директивы также устанавливают следующие настройки: opcache.validate_timestamps=0, opcache.enable_file_override=1 и opcache.file_cache_consistency_checks=0.

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

Предустановленное значение директивы opcache.jit_hot_loop теперь равно простому числу 61; простое число с меньшей вероятностью окажется кратным количеству повторений цикла.

PHP теперь сообщит об ошибке, если значение директивы opcache.memory_consumption изменили после инициализации общей памяти модуля OPcache; раньше уведомление не выдавалось, а в информации о настройках PHP выводилось некорректное значение.

Модуль OpenSSL

Добавлена опция openssl.libctx для выбора типа контекста библиотеки OpenSSL. Можно использовать либо настраиваемый libctx для каждого потока, либо один глобальный (по умолчанию) libctx.

Производительность

Ядро PHP

Удалены OP-коды для сравнения идентичности с логическими значениями, в частности для шаблона match(true).

Добавлена специализация OPcode для сравнений === [] и !== [].

Создание объектов исключений теперь происходит намного быстрее.

Части кода, в которых использовался SSE2, были адаптированы для использования SIMD с ARM NEON.

Введена виртуальная машина TAILCALL, включенная по умолчанию при компиляции с Clang>=19 на x86_64 или aarch64. Виртуальная машина TAILCALL работает так же быстро, как виртуальная машина HYBRID, используемая при компиляции с GCC. Благодаря этому бинарные файлы PHP, скомпилированные с Clang>=19, работают так же быстро, как бинарные файлы, скомпилированные с GCC. Производительность виртуальной машины CALL, используемой с другими компиляторами, также значительно улучшилась.

Модуль интернационализации

Внутренняя функция перестала создавать лишние копии строк при перекодировании перед обработкой средством сопоставления.

Модуль MBString

Части кода, в которых использовался SSE2, были адаптированы для использования SIMD с ARM NEON.

Модуль Opcache

Улучшена производительность извлечения переменных TLS в коде JIT в сборках без Glibc.

Модуль интроспекции кода Reflection

Улучшена производительность следующих методов:

Модуль SPL

Улучшена производительность методов доступа к размерам и методов SplFixedArray.

Стандартные модули

Улучшенная производительность функций для работы с массивами с callback-функциями (array_find(), array_filter(), array_map(), usort(), ...).

Улучшена производительность функций urlencode() и rawurlencode().

Улучшена производительность функции unpack() с безымянными повторениями за счёт отказа от создания временных строк и их повторного анализа.

Улучшена производительность функции pack().

Незначительные улучшения производительности функции array_chunk().

Модуль XML

Улучшена производительность доступа к свойству класса XMLReader.

Улучшена производительность класса XMLWriter и уменьшено потребление памяти.