PHP 8.3 要求 ICU ≥ 68.2、opcache.save_comments=On、弃用 mysql_old_password 认证,并默认禁用 xmlrpc 和 sodium 扩展。

PHP 8.3 运行时依赖的 ICU 版本必须 ≥ 68.2
很多人在编译或升级 PHP 8.3 后遇到 intl 扩展加载失败、datefmt_create() 报错或中文日期格式化乱码,根本原因常是系统 ICU 太旧。PHP 8.3 显式要求 ICU ≥ 68.2(2020 年发布),而 CentOS 7 默认 ICU 50.x、Ubuntu 18.04 默认 ICU 60.x,均不满足。
- 用
icu-config --version检查当前版本;低于 68.2 就得手动升级 ICU(不能只升级 php-intl 包) - 源码编译 PHP 时,务必加
--with-icu-dir=/path/to/icu68指向新 ICU 安装路径 - Docker 用户注意:alpine:3.20+ 自带 ICU 73,但
php:8.3-apache官方镜像基于 Debian,需额外apt install libicu-dev并确认版本
opcache.save_comments 必须设为 On(默认已改)
PHP 8.3 默认将 opcache.save_comments 设为 Off —— 这会直接导致 Doctrine、Laravel、Symfony 等依赖 PHPDoc 注解的框架启动失败,报错如 ReflectionException: Class XXX does not exist 或注解解析为空。
- 不是所有环境都会显式写这个配置,尤其 Docker 或一键脚本部署时容易遗漏
- 检查方式:运行
php -i | grep opcache.save_comments,输出应为On - 若用 ini 文件管理,确保有明确行:
opcache.save_comments=1(不能只靠默认值) - 该设置影响性能极小,关闭无实质收益,强行关只会引发框架兼容问题
mysqlnd 驱动不再支持 mysql_old_password 认证
PHP 8.3 彻底移除了对 MySQL 4.1 旧密码哈希(mysql_old_password)的支持。如果数据库用户仍用 OLD_PASSWORD() 或 SET PASSWORD ... = OLD_PASSWORD(...) 设置密码,PHP 连接时会直接抛出 PDOException: Unknown authentication method 或 mysqli_connect(): Unknown server error。
- 检查用户认证方式:在 MySQL 中执行
SELECT host, user, plugin FROM mysql.user WHERE user = 'xxx';,plugin 字段若为mysql_old_password就必须改 - 升级方式:用
ALTER USER 'xxx'@'%' IDENTIFIED WITH caching_sha2_password BY 'pwd';(推荐)或mysql_native_password - 注意:MariaDB 10.4+ 默认禁用 old_password,但某些遗留镜像或自建容器可能仍启用,需主动验证
核心扩展变动:xmlrpc 和 sodium 不再默认启用
PHP 8.3 把 xmlrpc 和 sodium 从「默认启用」降级为「需显式启用」。如果你的应用依赖 xmlrpc_encode() 或 sodium_crypto_box_keypair(),但没在 php.ini 里打开对应扩展,就会遇到 Call to undefined function 错误。
立即学习“PHP免费学习笔记(深入)”;
-
xmlrpc:虽已过时,但部分老 CMS(如 WordPress 插件)、内部 RPC 接口仍在用,需加extension=xmlrpc -
sodium:PHP 7.2+ 就内置,但 8.3 起不再自动加载;现代加密逻辑(如 Laravel 的 encrypter)强依赖它,漏配会导致encrypt()直接崩溃 - 验证命令:
php -m | grep -E '^(xmlrpc|sodium)$',空输出即未启用
opcache.save_comments 是最常被跳过的两个点——前者藏在底层依赖里看不见,后者改了默认值却没同步进配置模板。别信“升级完跑个 phpinfo 就行”,一定要跑真实业务代码路径。



















