船说 CMS 支持 PHP8 吗
看完这篇,你能自己判断手上的船说 CMS 到底能不能跑在 PHP 8 上,跑不了的话知道该降级还是该改代码。
很多人升级服务器环境时顺手把 PHP 从 7.4 调到 8.0,结果网站直接白屏或者报一堆 Fatal error。船说 CMS 的情况是:**官方没有明确的 PHP 8 兼容声明,绝大多数现成版本是按 PHP 5.6~7.x 写的,直接换到 PHP 8 大概率跑不起来。** 但这不能靠猜,下面按步骤实测。
第一步:确认你的船说 CMS 版本和当前 PHP 版本
先拿到两个数字,不然没法判断。
- 看 PHP 版本:后台一般有「系统」→「系统信息」页面,里面会列出 PHP 版本、MySQL 版本。如果没有,就在网站根目录建一个
phpinfo.php,内容写<?php phpinfo(); ?>,浏览器访问你的域名/phpinfo.php,看完记得删掉。 - 看 CMS 版本:根目录下找
version.php、config.php或者composer.json,文件里通常有版本号。后台页脚一般也会写。
注意:
phpinfo.php会把服务器路径、扩展、环境变量全暴露出来,测完必须删除,别留在线上。
第二步:查官方的兼容性说明
打开船说 CMS 的官方发布页或更新日志,找两个关键词:PHP 8、兼容。重点看最近一次更新的时间和更新说明里提到的适配版本。
如果最新版更新日志里压根没提 PHP 8,那就默认它没适配。别指望"没说不支持就是支持",老 CMS 的代码里大量用了 PHP 8 已经删掉的函数。
第三步:用工具扫一遍代码,看有多少坑
这一步不用把网站跑起来,直接静态扫描。装 PHPCompatibility:
composer global require "squizlabs/php_codesniffer=*"
composer global require phpcompatibility/php-compatibility
phpcs --config-set installed_paths ~/.composer/vendor/phpcompatibility/php-compatibility
然后扫描网站目录:
phpcs -p /www/wwwroot/你的站点 --standard=PHPCompatibility --runtime-set testVersion 8.0-8.2 --extensions=php
输出里会逐条列出哪一行用了 PHP 8 不支持的东西。常见的几类:
each():PHP 8.0 已彻底移除$str{0}这种花括号取字符:PHP 8.0 移除,必须改成$str[0]- 同名方法当构造函数:不再生效
- 传
null给内部函数的非空参数:已废弃并大量报警
再手动补两刀快速定位:
grep -rn "each(" --include="*.php" .
grep -rnE '\$[a-zA-Z_][a-zA-Z0-9_]*\{[0-9]+\}' --include="*.php" .
第四步:搭测试环境实跑一遍
扫描只能发现语法层面的问题,运行时错误得实际跑才知道。别直接在线上切 PHP 版本。
如果你用宝塔面板:先复制一份站点和数据库,新建一个测试站点,然后「网站」→ 选中测试站点 →「设置」→「PHP版本」→ 下拉选 PHP 8.0 → 保存。再逐个点开前台首页、栏目页、内容页、后台登录、后台发布文章。
如果你用 phpStudy:首页 →「网站」→ 对应站点「管理」→「PHP版本切换」→ 选 8.0。
重点测这几处,它们最容易炸:后台登录、文章发布、附件上传、伪静态规则。
第五步:根据结果决定怎么处理
情况 A:测试站一切正常。 说明你这个版本已经适配过了,可以放心切换线上环境。切换前记得完整备份数据库和网站目录。
情况 B:白屏或报错。 两个选择:
- 最省事:切回 PHP 7.4。 在宝塔的「网站 → 设置 → PHP版本」里改回
PHP 7.4,保存即恢复。7.4 官方安全支持已结束,但作为过渡完全够用。 - 想上 PHP 8:按扫描结果改代码。 把
each()循环改写成foreach,把$str{0}改成$str[0]。改动量大、又不懂 PHP 的话,建议直接找 CMS 官方或开发者做适配,自己硬改容易把功能改坏。
注意:数据库备份和文件备份要分别做。只备份文件不备份数据库,出问题时数据找不回来。
小结
- 船说 CMS 官方对 PHP 8 没有明确兼容承诺,现成版本默认按 5.6~7.x 开发,直接切 PHP 8 大概率报错。
- 判断顺序:确认版本 → 查官方更新日志 → 用 PHPCompatibility 静态扫描 → 测试站实跑。
- 最容易出问题的是
each()和$str{0}这两类写法。 - 永远先在测试站验证,别拿线上站当试验田。
- 跑不通又不改代码,就把 PHP 版本切回 7.4,这是代价最小的方案。
原文链接:https://www.gj0.com/thread-78.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。