PHP 8.5.0 Released!

其它变更

核心变更

核心

macOS 上的高精度计时器(hrtime())现已采用推荐的 clock_gettime_nsec_np(CLOCK_UPTIME_RAW) API,取代原先的 mach_absolute_time()

CGI/CLI

已移除 -z--zend-extension 选项,因其不具备实际功能;应改用 -d zend_extension=[path]

PDO_ODBC

大列的获取行为已调整。PDO_ODBC 不再以 256 字节块为单位获取数据,而是尝试获取更大的块大小;当前该大小为页面大小减去字符串开销。同时,对在 SQLGetData 中返回 SQL_NO_TOTAL 的驱动程序也做了更好支持。此举有助于提升兼容性与性能。

SAPI 模块的变更

CLI

使用 cli_set_process_title() 设置过长的进程标题时,现在会失败,而非静默截断指定标题。

新增 --ini=diff 选项,用于输出与内置默认值不同的 INI 配置项。

FPM

FPM 在配合 httpd ProxyPass 使用时,可选地对完整脚本路径进行解码。新增 fastcgi.script_path_encoded INI 配置项,用于禁用此新行为。

FPM 访问日志长度限制现已遵循 log_limit 配置值。

函数变更

Intl

grapheme_extract() 在跳过无效起始字节时,现已正确设置 $next 的值。此前在某些情况下,该值会指向字母边界起始位置,而非结束位置。

transliterator_get_error_code()transliterator_get_error_message()TransLiterator::getErrorCode()TransLiterator::getErrorMessage() 已从返回类型联合中移除 false,因为实际上这些函数可能从未返回 false

以下函数现已支持 $localegrapheme_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

openssl_public_encrypt()openssl_private_decrypt() 新增 $digest_algo 参数,用于指定 OAEP 填充所使用的散列摘要算法。

openssl_sign()openssl_verify() 新增 $padding 参数,以支持使用更安全的 RSA PSS 填充方式。

openssl_cms_encrypt()$cipher_algo 参数现可接受表示加密算法名称的字符串,从而支持更多算法,包括用于认证加密数据的 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 参数是否包含 null 字节。

pg_close_stmt() 会检查 statement_name 参数是否包含 null 字节。

POSIX

posix_ttyname() 在遇到无效文件描述符时,会将 last_error 设置为 EBADF。

posix_isatty() 遇到无效文件描述符时,会触发 E_WARNING 消息。

posix_fpathconf() 会检查无效的文件描述符,并将 last_error 设置为 EBADF,同时触发 E_WARNING 消息。

Reflection

ReflectionClass::__toString() 对枚举的输出已调整,以更清晰地表明该类为枚举类型,并说明其中的枚举项属于枚举成员,而非普通类常量。

对于带有挂钩的属性,ReflectionProperty::__toString() 的输出已调整,以标明该属性包含哪些挂钩、这些挂钩是否为 final,以及该属性是否为虚拟属性。当类中包含带挂钩的属性时,ReflectionClass::__toString() 的输出也会相应变化。

Sockets

socket_create()/socket_bind() 可创建 AF_PACKET 协议族的套接字。

socket_getsockname() 可获取 AF_PACKET 套接字的接口索引及其字符串表示形式。

Zlib

gzfile()gzopen()readgzfile() 函数的 $use_include_path 参数已从 int 类型改为 bool 类型。

gzfile()gzopen()readgzfile() 函数现已遵循默认的 stream 上下文。

扩展的其他变更

cURL

curl_setopt()CURLOPT_FOLLOWLOCATION 选项的值不再视为 bool 类型,而是作为 int 类型处理,以支持 CURLFOLLOW_OBEYCODECURLFOLLOW_FIRSTONLY

Fileinfo

file 已从 5.45 升级至 5.46。

finfo_close() 的返回类型已从 bool 改为 true

Intl

Intl 的内部错误机制已现代化,能够更准确地指示哪个调用位置引发了何种错误。此外,部分 ext/date 抛出的异常现已封装在 IntlException 中。

Lexbor

新增始终启用的 lexbor 扩展,其中包含从 ext/dom 中分离出来的 lexbor 库,以便在其他扩展中复用。该新扩展不直接向用户空间暴露。

Opcache

Opcache 扩展现已始终内置于 PHP 二进制文件中并自动加载,仍会遵循 INI 配置项 opcache.enableopcache.enable_cli

PCRE

pcre2lib 已从 10.44 升级至 10.46。

PDO_Sqlite

最低支持的发布版本已从 3.7.7 提升至 3.7.17。

Reflection

ReflectionConstant 不再是 final 类。

INI 文件处理的变更

Core

新增 fatal_error_backtraces 配置项,用于控制致命错误是否包含回溯信息。

新增仅在启动时生效的 max_memory_limit INI 配置项,用于限制 memory_limit 在启动或运行时可设置的最大值。若超过该值(除非设为 -1),将发出警告,并将 memory_limit 设为当前的 max_memory_limit 值。

Opcache

新增 opcache.file_cache_read_only 配置项,用于支持只读的 opcache.file_cache 目录,适用于只读文件系统(例如只读 Docker 容器)。建议配合 opcache.validate_timestamps=0opcache.enable_file_override=1opcache.file_cache_consistency_checks=0 使用。

注意: 由不同版本的 PHP 构建、不同文件路径或不同配置(包括加载的扩展)生成的缓存可能不会使用。

opcache.jit_hot_loop 的默认值现为 61(质数),以避免其成为循环迭代次数的倍数。建议将此参数设为质数。

当 OPcache SHM 已设置好后修改 opcache.memory_consumption 将正确报告失败,而非静默无操作并在 phpinfo() 中显示误导性的值。

OpenSSL

新增 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 性能也显著提升。

Intl

现在在将字符串转换为整理器使用时,避免了创建额外的字符串副本。

MBString

代码中使用 SSE2 的部分现已适配,同时支持 ARM NEON 的 SIMD 指令。

Opcache

在非 Glibc 构建中,JIT 编译代码获取 TLS 变量的性能得到提升。

SPL

SplFixedArray 的维度访问器和方法性能得到提升。

标准

带有回调函数的数组操作函数(如 array_find()array_filter()array_map()usort() 等)性能得到提升。

urlencode()rawurlencode() 的性能得到提升。

unpack() 在处理无名称重复项时性能得到提升,通过避免创建临时字符串并重复解析。

提升 pack() 性能。

array_chunk() 的性能有小幅提升。

XML

提升 XMLReader 属性访问性能。

提升 XMLWriter 的性能,内存占用有所降低。

添加备注

用户贡献的备注

此页面尚无用户贡献的备注。
To Top