排除阻碍 PHP2Shell 修复的废弃接口、依赖冲突、扩展缺失和网关错误。在带补丁的 PHP 上恢复业务,并核实两个 CVE 的修复证据。
01
mysql_connect、each、create_function 不存在
先确定失败请求的真实 PHP。ext/mysql 在 PHP 7 被移除,each() 与 create_function() 在 PHP 8 被移除。升级对应应用或扩展,或在私有副本重构;改用 PDO/mysqli 时保持参数绑定和事务语义。盲目替换函数名或安装来路不明的兼容补丁会引入数据和安全问题。
02
TypeError 与方法声明不兼容
在受限日志记录完整错误、包名和调用栈,对比二次开发重写方法与目标父类、接口的签名,检查参数、返回值和内置函数规则。升级责任依赖或修正代码后测试。不要批量删除类型声明掩盖契约问题,也不要向公网展示详细报错。
03
PHP 8.2 动态属性弃用提示
弃用警告本身不代表 RCE 或已入侵。定位创建未声明属性的类,采用维护版本或有意设计的属性、模型修复,并验证序列化与 ORM。可把警告写入私有日志,同时消除原因;全局关闭错误不是升级方案,也不能修复 PHP2Shell。
04
Composer 提示平台依赖冲突
保留 composer.json 与 composer.lock,在可信工作副本查看锁定包并执行 check-platform-reqs --lock,用 prohibits 找出阻挡目标 PHP 的包。config.platform 只模拟依赖求解环境,不会改变运行中的 PHP。--ignore-platform-reqs 不能证明兼容。修改锁文件后先审查、测试再部署。
05
缺少 intl、mbstring、PDO 驱动或编译扩展
分别对比 CLI 和域名 Web/FPM 加载的 INI 与模块。安装与 PHP、架构和 NTS/ZTS 匹配的可信扩展,在正确服务启用,并按维护流程重启受影响进程。随后真正测试连接或函数。命令行有模块,不代表网站进程也有。
06
502、白屏或仍跑旧 PHP
把 Web 服务上游错误与 FPM 启动、应用日志对齐。切 PHP 后检查 socket/端口、进程池权限、服务状态与目标二进制;不兼容扩展可能让工作进程启动失败。先校验配置再受控重载,保留日志,不要盲目反复切版本。单个 502 不能证明入侵。
07
乱码、链接失效与迁移数据异常
分别检查源文件编码、数据库连接字符集和排序规则、导出编码、伪静态与存储路径。GBK 转 UTF-8 应单独演练并比较字节敏感字段、附件及 URL。不要对序列化字段批量字符串替换。保留原文章路径;确需改动时,核对内容和状态码后建立跳转映射。
核实 PHP2Shell 修复
应用兼容性、应用维护支持和 PHP 安全是三项独立检查。选择仍受支持且修复两个 CVE 的 PHP 分支,再验证 Web 工作进程、定时任务和全部副本。只更新框架或插件不会更换 PHP 解释器。
| PHP 分支 | 低于此版本的上游发行版 | 首个修复版本 | 安全支持结束 |
|---|---|---|---|
| PHP 8.5 | < 8.5.12 | ✓ 8.5.12 | 2029年12月31日 |
| PHP 8.4 | < 8.4.27 | ✓ 8.4.27 | 2028年12月31日 |
| PHP 8.3 | < 8.3.36 | ✓ 8.3.36 | 2027年12月31日 |
| PHP 8.2 | < 8.2.35 | ✓ 8.2.35 | 2026年12月31日 |
这些分支不会获得 PHP 项目常规版本更新。7.4、8.0、8.1 有最小源码回移植;厂商补丁状态需单独核实。 阅读指南 ↗