macOS 上的高精度计时器(hrtime())现已采用推荐的 clock_gettime_nsec_np(CLOCK_UPTIME_RAW)
API,取代原先的 mach_absolute_time()。
已移除 -z 或 --zend-extension 选项,因其不具备实际功能;应改用 -d zend_extension=[path]。
大列的获取行为已调整。PDO_ODBC 不再以 256 字节块为单位获取数据,而是尝试获取更大的块大小;当前该大小为页面大小减去字符串开销。同时,对在 SQLGetData 中返回 SQL_NO_TOTAL 的驱动程序也做了更好支持。此举有助于提升兼容性与性能。
FPM 在配合 httpd ProxyPass 使用时,可选地对完整脚本路径进行解码。新增 fastcgi.script_path_encoded INI 配置项,用于禁用此新行为。
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_get_option() 现在支持传入 null 连接(与 ldap_set_option() 一致),以便获取全局选项。
libxml_set_external_entity_loader() 现在具有正式的返回类型 true。
openssl_public_encrypt() 和 openssl_private_decrypt() 新增
$digest_algo 参数,用于指定 OAEP 填充所使用的散列摘要算法。
openssl_sign() 和 openssl_verify() 新增
$padding 参数,以支持使用更安全的 RSA PSS 填充方式。
openssl_cms_encrypt() 的 $cipher_algo
参数现可接受表示加密算法名称的字符串,从而支持更多算法,包括用于认证加密数据的 AES-GCM 系列算法。
Pdo\Pgsql::copyFromArray() 现在支持 iterable 输入。
Pdo\Pgsql::setAttribute() 和 Pdo\Pgsql::prepare()
支持将 PDO::ATTR_PREFETCH 设为 0,以启用延迟获取模式。在此模式下,语句无法并行执行。
pg_copy_from() 现在支持 iterable 输入。
pg_connect() 会检查 connection_string 参数是否包含 null 字节。
pg_close_stmt() 会检查 statement_name 参数是否包含 null 字节。
posix_ttyname() 在遇到无效文件描述符时,会将 last_error 设置为 EBADF。
当 posix_isatty() 遇到无效文件描述符时,会触发 E_WARNING 消息。
posix_fpathconf() 会检查无效的文件描述符,并将 last_error 设置为
EBADF,同时触发 E_WARNING 消息。
ReflectionClass::__toString() 对枚举的输出已调整,以更清晰地表明该类为枚举类型,并说明其中的枚举项属于枚举成员,而非普通类常量。
对于带有挂钩的属性,ReflectionProperty::__toString() 的输出已调整,以标明该属性包含哪些挂钩、这些挂钩是否为 final,以及该属性是否为虚拟属性。当类中包含带挂钩的属性时,ReflectionClass::__toString() 的输出也会相应变化。
socket_create()/socket_bind() 可创建 AF_PACKET 协议族的套接字。
socket_getsockname() 可获取 AF_PACKET 套接字的接口索引及其字符串表示形式。
gzfile()、gzopen() 和 readgzfile()
函数的 $use_include_path 参数已从 int 类型改为 bool 类型。
gzfile()、gzopen() 和 readgzfile() 函数现已遵循默认的 stream 上下文。
curl_setopt() 中 CURLOPT_FOLLOWLOCATION 选项的值不再视为
bool 类型,而是作为 int 类型处理,以支持 CURLFOLLOW_OBEYCODE 和
CURLFOLLOW_FIRSTONLY。
Intl 的内部错误机制已现代化,能够更准确地指示哪个调用位置引发了何种错误。此外,部分 ext/date 抛出的异常现已封装在 IntlException 中。
新增始终启用的 lexbor 扩展,其中包含从 ext/dom 中分离出来的 lexbor 库,以便在其他扩展中复用。该新扩展不直接向用户空间暴露。
Opcache 扩展现已始终内置于 PHP 二进制文件中并自动加载,仍会遵循 INI 配置项 opcache.enable 和 opcache.enable_cli。
pcre2lib 已从 10.44 升级至 10.46。
最低支持的发布版本已从 3.7.7 提升至 3.7.17。
readline_add_history()、readline_clear_history() 和 readline_callback_handler_install() 的返回类型已从 bool 改为 true。
ReflectionConstant 不再是 final 类。
新增 fatal_error_backtraces 配置项,用于控制致命错误是否包含回溯信息。
新增仅在启动时生效的 max_memory_limit INI 配置项,用于限制 memory_limit 在启动或运行时可设置的最大值。若超过该值(除非设为 -1),将发出警告,并将 memory_limit 设为当前的 max_memory_limit 值。
新增 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(质数),以避免其成为循环迭代次数的倍数。建议将此参数设为质数。
当 OPcache SHM 已设置好后修改 opcache.memory_consumption 将正确报告失败,而非静默无操作并在 phpinfo() 中显示误导性的值。
新增 openssl.libctx,用于选择 OpenSSL 库上下文类型。可为每个线程使用独立的自定义 libctx,或使用单一的全局 libctx(默认)。
移除了针对布尔值的恒等比较操作码,尤其是用于 match(true) 模式的操作码。
为 === [] 和 !== [] 比较操作新增了 OPcode 专用优化。
创建异常对象的速度现已显著提升。
代码中使用 SSE2 的部分现已适配,同时支持 ARM NEON 的 SIMD 指令。
引入了 TAILCALL VM,在使用 Clang>=19 上编译 x86_64 或 aarch64 架构时默认启用。TAILCALL VM 的性能与使用 GCC 编译时采用的 HYBRID VM 相当,使得 Clang>=19 构建的 PHP 二进制文件性能达到 GCC 构建版本的水平。此外,其他编译器所使用的 CALL VM 性能也显著提升。
现在在将字符串转换为整理器使用时,避免了创建额外的字符串副本。
代码中使用 SSE2 的部分现已适配,同时支持 ARM NEON 的 SIMD 指令。
在非 Glibc 构建中,JIT 编译代码获取 TLS 变量的性能得到提升。
以下方法的性能得到提升:
SplFixedArray 的维度访问器和方法性能得到提升。
带有回调函数的数组操作函数(如 array_find()、array_filter()、array_map()、usort() 等)性能得到提升。
urlencode() 和 rawurlencode() 的性能得到提升。
unpack() 在处理无名称重复项时性能得到提升,通过避免创建临时字符串并重复解析。
提升 pack() 性能。
array_chunk() 的性能有小幅提升。