CLI与Web版本必须分别控制:php -v仅反映命令行环境,网站实际版本由php-fpm监听地址(如fastcgi_pass)和对应配置决定,二者完全独立,无法“无缝切换”。

直接在 CLI 和 Web 服务间“无缝切换”不存在——PHP 7.4 和 8.2 的差异足够让 php -v 和网站实际运行版本完全脱节。你必须分别控制 CLI 环境和 php-fpm 进程,且两者不能共用同一套配置逻辑。
确认当前 CLI 使用的是哪个 PHP 版本
很多人执行 phpenv global 8.2 或 brew link php@8.2 后,php -v 显示正确,但网站仍是 7.4,原因就是 CLI 切换不等于 Web 切换。
- 运行
which php查看二进制路径,再对比php -i | grep "Loaded Configuration File"确认加载的php.ini - 若用
phpenv,必须执行phpenv rehash后再验证;若用 Homebrew,确保/usr/local/bin在$PATH中靠前,且未被系统/usr/bin/php覆盖 - 检查项目根目录是否有
.php-version文件,内容必须严格为8.2(不是8.2.0或php-8.2),否则phpenv不识别
Web 服务根本没切过去?先查 nginx 配置和 php-fpm socket
Nginx 不会自动感知你装了新 PHP,它只按配置里写的地址去连 php-fpm。哪怕 php82 -v 正常,只要 Nginx 指向 unix:/tmp/php-cgi-74.sock,网站就永远跑在 7.4 上。
- 进宝塔「网站」→「设置」→「配置文件」,搜
fastcgi_pass,确认值是unix:/tmp/php-cgi-82.sock或127.0.0.1:9002(取决于你的 php-fpm 8.2 监听方式) - 对应去查 php-fpm 8.2 的配置文件(如
/www/server/php/82/etc/php-fpm.d/www.conf),确认listen =值与 Nginx 中完全一致,包括路径、权限、协议(unix vs tcp) - 运行
ls -l /tmp/php-cgi-82.sock,属主必须是www(宝塔默认用户),否则加listen.owner = www和listen.group = www并重启 php-fpm
扩展缺失或函数废弃导致白屏,别等上线才发现
PHP 8.2 移除了 create_function()、禁用动态属性、强制类型声明,还彻底删掉了 mcrypt、mysql_* 扩展。这些不会报 Warning,而是直接 Fatal error 或空白页。
立即学习“PHP免费学习笔记(深入)”;
- 在测试环境用
php82 -l your-file.php检查语法,用php82 -m | grep -E "(redis|mysqli|fileinfo)"确认关键扩展已启用 - 老项目依赖
ext-mongo?必须换成ext-mongodb并重写代码;还在用mysql_connect()?得全替成mysqli或PDO - 别跳过
user.ini冲突:PHP 7.4 的user.ini可能含disable_functions = pcntl_fork,而 PHP 8.2 默认不允许覆盖该指令,会导致解析失败
session 目录权限错位是 502 最隐蔽的元凶
即使 socket 路径、权限、扩展都对,session_start() 仍可能因目录不可写而静默失败,Nginx 日志只显示 connect() to unix:/tmp/php-cgi-82.sock failed,实际是 php-fpm worker 启动时卡在 session 初始化。
- 查 php-fpm 8.2 的错误日志:
/www/wwwlogs/php82.log,搜索Failed to initialize storage module或session.save_path - 确认
session.save_path指向的目录(如/www/php_session)存在,且属主为www、权限为700或755 - 如果站点用了自定义
session.save_path,务必在 php-fpm 8.2 的php.ini和站点.user.ini中同步更新,不能只改一处
真正容易被忽略的从来不是“怎么切”,而是“切完谁在用哪份配置”。CLI 的 php.ini、php-fpm 的 php.ini、站点级的 .user.ini、Nginx 的 fastcgi_params,四者各自生效,任何一处漏配,都会让切换变成幻觉。



















