PHP 8.1升级必须停用已移除函数(如create_function、mysql_*)、规避弃用行为(如向字符串函数传null)、卸载不兼容扩展(如apcu-bc、mcrypt),否则将导致致命错误或服务异常。

PHP 7.4 升级到 8.1 时,很多过去“能跑但不规范”的写法会直接报错或触发弃用警告。这些不是可选项,而是必须提前识别并处理的硬性障碍。重点不是“关掉函数”,而是停用已被移除或标记为弃用的语法和扩展,否则上线后服务可能白屏、接口500、日志刷屏。
必须停用或替换的已移除函数
这些函数在 PHP 8.1 中已彻底删除,调用即致命错误(Fatal error),无法通过 error_reporting 关闭:
create_function():动态生成函数的老方法,8.0 起移除。不能用 eval() 替代,应改写为匿名函数,例如:
create_function('$a,$b', 'return $a+$b;')→fn($a, $b) => $a + $b或function($a, $b) { return $a + $b; }mysql_* 系列函数(如 mysql_connect、mysql_query):自 PHP 7.0 起废弃,8.1 完全不存在。必须迁移到 mysqli 或 PDO,并注意连接方式、预处理、错误处理逻辑变更。
-
finfo_close():虽在 8.1 中已是空操作(NOP),但继续调用无意义;8.5 起正式弃用。建议直接删掉所有 finfo_close() 调用,finfo 对象离开作用域会自动释放。
立即学习“PHP免费学习笔记(深入)”;
必须规避的弃用行为(会触发 Deprecated 警告)
这类问题不会中断执行,但大量出现会污染日志,且在 PHP 8.2+ 将升级为 TypeError:
向字符串类函数传 null:如
strlen(null)、mb_strlen(null)、trim(null)、htmlspecialchars(null)。修复方式统一为防御性判断:$str ?? ''、is_string($str) ? strlen($str) : 0、或!empty($str) && strlen($str)PHP 8.5.12下载修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
array_key_exists() / in_array() 的第二个参数为 null:
array_key_exists('id', null)会报弃用。应先is_array($arr)再调用。mb_strpos() / mb_stripos() 第三个参数为 float:如
mb_strpos($s, 'x', strpos($s, 'y') / 2)。必须显式转整型:(int) $offset或intval($offset)
必须卸载的不兼容扩展
这些扩展与 PHP 8.1 不兼容,装着会导致 php-fpm 启动失败或模块加载报错:
php-pecl-apcu-bc:APCu 向后兼容层,8.1 不支持,卸载后改用原生 apcu 扩展(需确认版本 ≥ 5.1.20)
php-pecl-mcrypt:已彻底淘汰,功能请迁移到 sodium(推荐)或 openssl
任何基于 PHP 7.4 编译的自定义扩展(如旧版 imagick、xdebug 2.x):必须升级到支持 PHP 8.1 的版本,否则
php -v都会失败
不复杂但容易忽略


















