Typecho 在 PHP 8.0 环境下运行报错 deprecated 警告怎么消除

文章导读
Typecho 在 PHP 8.0 上报错 deprecated 警告,最推荐的消除方法是升级 Typecho 核心程序到支持 PHP 8.0 的最新稳定版本,并同步更新所有插件和模板。如果无法立即升级,可在 php.ini 中调整 error_reporting 级别临时屏蔽警告,但这会掩盖潜在的致命兼容性问题,仅适合开发环境调试,生产环境必须修复代码兼容性。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
A A

Typecho 在 PHP 8.0 上报错 deprecated 警告,最推荐的消除方法是升级 Typecho 核心程序到支持 PHP 8.0 的最新稳定版本,并同步更新所有插件和模板。如果无法立即升级,可在 php.ini 中调整 error_reporting 级别临时屏蔽警告,但这会掩盖潜在的致命兼容性问题,仅适合开发环境调试,生产环境必须修复代码兼容性。

先说结论:升级 Typecho 核心至最新稳定版是消除 PHP 8.0 deprecated 警告的唯一可靠方案,调整错误报告级别仅能临时隐藏症状。

  • 先确认:检查当前 Typecho 版本和 PHP 版本是否匹配
  • 先备份:升级前完整备份网站文件和数据库
  • 再验证:升级后检查前台页面和后台错误日志

命令速用版

若需临时屏蔽警告以便排查其他问题,可在网站根目录的 index.php 顶部或 php.ini 中添加以下配置,注意这不会修复代码兼容性:

error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE);

检查 PHP 版本命令:

php -v

查看 PHP 错误日志位置(根据 php.ini 配置):

grep "error_log" /path/to/php.ini

为什么会这样

PHP 8.0 移除了旧版扩展并加强了类型检查,导致旧版 Typecho 代码触发废弃警告。PHP 8.0 正式移除了 mysql_* 系列函数,旧版 Typecho 若依赖未适配的数据库层会直接报错;同时 PHP 8.0 废弃了花括号字符串访问语法(如 $str{0}),旧代码中此类写法会触发 Deprecated 警告。此外,PHP 8.0 对可选参数跟在必需参数之后的函数定义也抛出警告,旧版插件或核心代码若未遵循新规范就会显示错误信息。

Typecho 在 PHP 8.0 环境下运行报错 deprecated 警告怎么消除

分步处理

第一步:备份当前环境。复制整个网站目录到备份文件夹,并导出完整数据库 SQL 文件,确保升级失败可回滚。

第二步:下载最新核心。访问 Typecho 官方下载页获取最新稳定版安装包,不要使用第三方修改版。

第三步:替换核心文件。上传新文件覆盖旧文件,但必须保留根目录下的 config.inc.php 和 usr 目录(包含主题和插件配置),避免配置丢失。

第四步:更新插件和模板。进入后台检查插件列表,停用并删除不再维护的旧插件,更新所有支持 PHP 8.0 的插件到最新版本。

第五步:调整错误报告(可选)。若升级后仍有非致命警告,可在 php.ini 中设置 error_reporting = E_ALL & ~E_DEPRECATED,但需确认无 Fatal Error。

Typecho 在 PHP 8.0 环境下运行报错 deprecated 警告怎么消除

怎么验证是否生效

刷新网站前台和后台页面,观察页面顶部是否还有 Deprecated 警告文字。检查服务器错误日志文件,确认没有新的 PHP 报错记录。尝试发布文章、评论和登录后台,确保核心功能无白屏或数据库连接错误。

常见坑

仅屏蔽警告不升级核心会导致隐藏致命错误,PHP 8.0 下某些 mysql_* 调用会直接变成 Fatal Error 而非 Warning,屏蔽后页面会白屏且无提示。旧版插件可能不兼容新版核心,升级后若后台功能异常,需逐个停用插件排查。config.inc.php 文件权限若设置错误,升级后可能导致无法写入配置或报错 500。

常见问题

能不能只改 error_reporting 不升级?

不建议,这只能隐藏警告不能解决兼容性问题,PHP 8.0 下某些废弃函数调用会直接导致 fatal error 使页面白屏。

升级后后台打不开怎么办?

检查错误日志,通常是插件不兼容导致,尝试重命名 usr/plugins 目录临时禁用所有插件再访问后台。

为什么升级了还有警告?

可能是主题或插件代码未更新,需单独检查主题 functions.php 和插件文件中是否有废弃语法。