PHP 8.0 已彻底移除 mysql_connect(),必须改用 mysqli_connect() 或 PDO;全局搜索替换旧函数时需同步更新连接参数、错误处理及对象依赖逻辑。

PHP 8.0 直接报 Fatal error:mysql_connect() 未定义
这不是配置问题,是函数被彻底移除了。PHP 7.0 起已废弃 mysql_* 全系列函数,到 PHP 8.0 完全删除,调用就会触发 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
实操建议:
- 全局搜索
mysql_connect、mysql_query、mysql_fetch_array等,替换为mysqli或PDO实现(注意连接参数、错误处理逻辑要同步改) - 别用“简单替换字符串”方式处理,比如把
mysql_query($sql)改成mysqli_query($conn, $sql)前,必须确保$conn是有效mysqli连接对象 - 若项目用了老旧 CMS(如早期 Discuz! X2/X3),优先查官方是否发布 PHP 8 兼容补丁,而不是硬改底层函数
php -m 显示 redis 扩展已加载,但 new Redis() 报 class not found
扩展名存在 ≠ 类可用。PHP 8.0 的 ABI(应用二进制接口)与 7.4 不兼容,旧版 redis.so 文件无法在 PHP 8 下正确初始化类注册表,进程启动时可能静默失败或只加载扩展名不注册类。
实操建议:
- 执行
php --ri redis,若输出里没有Redis => enabled和类列表,说明扩展没真正生效 - 检查
/www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/(路径中的20200930是 PHP 8.0 的 ABI ID)下redis.so是否存在;不存在就去宝塔「软件商店 → PHP 8.0 → 安装扩展」里重装 Redis - 别从 PHP 7.4 环境复制
redis.so过来,哪怕文件名一样,ABI 不匹配会导致PHP Warning: PHP Startup: Unable to load dynamic library或更隐蔽的段错误
访问页面空白,error_log 里只有 “PHP Parse error: syntax error” 但没行号
这通常是因为 PHP 8.0 对语法容忍度大幅降低,而错误发生在解析阶段(parser phase),比如命名参数混用、尾部逗号缺失、或函数签名里默认值位置非法——这些在 PHP 7.4 可能只是警告甚至忽略,但在 8.0 直接中断解析,连堆栈都来不及输出完整信息。
实操建议:
- 用
find ./ -name "*.php" -exec php -l {} \; 2>&1 | grep "Parse error"扫描全部 PHP 文件,定位具体出错文件 - 重点检查含命名参数的调用,如
foo("x", bar: true)—— PHP 8.0 要求命名参数必须放在所有位置参数之后,否则报错 - 检查方法定义中默认值是否在非末尾参数上,例如
public function editSignAgency($text = '', $key),PHP 8.0 会拒绝这种写法,必须改为public function editSignAgency($key, $text = '') - 确认
short_open_tag在php.ini中设为On(PHP 8.0 默认Off),否则... ?>会被当纯文本输出,导致 HTML 结构崩坏
php-fpm 启动成功,Nginx 却返回 502 Bad Gateway
服务起来了,但 Nginx 和 PHP-FPM 之间根本没通上话。最常见原因是 socket 路径不一致:PHP-FPM 实际监听的是 /tmp/php-cgi-80.sock,而 Nginx 配置里还写着 fastcgi_pass unix:/tmp/php-cgi-74.sock,或者误配成 127.0.0.1:9000 但 PHP-FPM 并没开 TCP 监听。
实操建议:
- 查 PHP-FPM 实际监听地址:
php-fpm80 -t && grep "listen =" /www/server/php/80/etc/php-fpm.d/www.conf,确认是unix:/tmp/php-cgi-80.sock还是127.0.0.1:9000 - 进宝塔 → 网站 → 对应站点 → 配置文件,搜索
fastcgi_pass,确保其值与上一步完全一致 - 检查 socket 文件权限:
ls -l /tmp/php-cgi-80.sock,必须属主属组为www:www,且有读写权限(srw-rw----) - 改完 Nginx 配置后,务必运行
nginx -t校验,再systemctl reload nginx;只点面板「重载配置」有时不生效
升级 PHP 版本不是换二进制文件就完事,PHP 8.0 把过去“睁一只眼”的行为全变成了硬性约束。最容易被忽略的是:错误日志路径被 .user.ini 覆盖、OPcache 缓存残留旧字节码、以及扩展虽显示已加载但类注册失败——这三类问题不会报明显错误,只会让页面静默失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











