PHP 8.5 升级无需强制修改配置,但 OPcache+JIT 配置更关键:需启用 opcache.enable=1、调整 opcache.jit_buffer_size 至 256M,CLI 场景建议禁用 JIT;动态属性赋值触发 E_DEPRECATED;联合类型校验更严格;已移除扩展(如 mysql)须从 php.ini 清理。

PHP 8.5 和 8.4 在配置层面没有强制性的、必须修改的变动,但有几个关键配置项的实际效果和推荐值发生了变化——不是“不配就报错”,而是“配得不对就吃不到性能红利,甚至引发隐患”。重点不在新增 ini 项,而在已有配置的启用逻辑和参数取舍。
OPcache + JIT 配置更关键,且默认行为有调整
PHP 8.5 的 JIT 编译器默认启用 tracing 模式(opcache.jit=1205),比 8.4 更激进。但若未合理配置缓冲区或未启用 OPcache,JIT 实际不会生效,甚至拖慢启动。
- 必须确保 opcache.enable=1(FPM/CLI 均需检查,CLI 默认为 0)
- opcache.jit_buffer_size 建议设为 256M(8.4 下 128M 可能不够,尤其启用了预加载时)
- 若运行 CLI 工具或短生命周期脚本,opcache.jit=0 反而更稳——JIT 对这类场景收益极低,还可能因内存泄漏累积出问题
- 升级后首次运行前执行 opcache_reset(),避免旧缓存干扰新 JIT 策略
动态属性与弃用警告现在更严格
PHP 8.5 移除了对动态属性隐式创建的警告抑制机制。即使你没开 error_reporting=E_ALL,只要启用了 zend.assertions=1 或使用了某些静态分析工具,未声明就赋值的属性会直接触发 E_DEPRECATED。
- 检查代码中是否存在类似
$obj->undefined_prop = 'x';的写法 - 若依赖魔术方法(
__set),确保类已声明public function __set($name, $value),不能只靠隐式创建 - 开发环境建议临时开启
error_reporting = E_ALL | E_DEPRECATED快速暴露问题
类型相关配置影响变大
8.5 加强了联合类型和可空类型的运行时校验强度。虽然不靠 ini 控制,但以下配置会放大其影响:
立即学习“PHP免费学习笔记(深入)”;
-
zend.assertions=1:配合严格类型,能让
function foo(?string $s): int在传入 null 时提前报错,而非等到strlen($s)才崩 - opcache.validate_timestamps=0(生产环境)+ opcache.revalidate_freq=0:确保类型校验逻辑不被缓存绕过
- 若项目用了
declare(strict_types=1),8.5 中对array|string|null这类联合类型的参数校验更早、更硬,错误位置可能从函数体内前移到调用点
扩展依赖要重新核对
PHP 8.5 正式移除了部分长期废弃的扩展行为,配置里若还保留已移除扩展的加载项,会导致启动失败。
- 检查
php.ini中是否含extension=mysql.so或extension=convert.cyr.utf.dll——这些在 8.5 中已被彻底移除 -
extension=soap仍存在,但非标准 WSDL 解析行为已被禁用,若配置了自定义soap.wsdl_cache_dir,需确认路径可写且格式合规 - Windows 用户特别注意:
php_curl.dll、php_openssl.dll等扩展需使用 8.5 编译版,混用 8.4 的 DLL 会直接拒绝加载



















