排除阻碍 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.122029年12月31日
PHP 8.4< 8.4.27✓ 8.4.272028年12月31日
PHP 8.3< 8.3.36✓ 8.3.362027年12月31日
PHP 8.2< 8.2.35✓ 8.2.352026年12月31日
仍在使用 PHP 8.1 或更早版本?

这些分支不会获得 PHP 项目常规版本更新。7.4、8.0、8.1 有最小源码回移植;厂商补丁状态需单独核实。 阅读指南 ↗

原始来源

PHP security team原始来源 ↗CVE-2026-109618原始来源 ↗CVE-2026-109619原始来源 ↗PHP 7.0原始来源 ↗PHP 8.0原始来源 ↗PHP 8.2原始来源 ↗PHP原始来源 ↗Composer原始来源 ↗
无人维护的 PHP 老站如何修复 PHP2Shell ↗← 返回应用升级资料库