接手一个老站,phpinfo 第一行写着 PHP Version 5.2.6。新加的代码用了 $arr = [1, 2]; 直接白屏,日志里是 parse error: syntax error, unexpected [。
5.2.6 是 2008 年的版本,短数组语法要 5.4 才有,命名空间和闭包要 5.3 才有。不是代码写错,是版本太老。
这个版本能跑什么
以面向过程为主,mysql 系列函数还能用,register_globals 默认关闭但仍有项目依赖。PDO 和 mysqli 都已提供,json_encode 和 json_decode 从 5.2 开始内置。
不支持三元运算符简写,不支持 Traits 和生成器,finally 也没有。安全支持早在 2011 年结束,公开漏洞不少,别把这种站直接暴露在公网。
升级到 7.x 或 8.x 会踩的坑
mysql_connect 和 mysql_query 在 PHP 7.0 移除,换成 mysqli 或 PDO,参数顺序也不一样。ereg 和 split 系列移除,改 preg_match 和 preg_split。
register_globals 和 magic_quotes_gpc 在 5.4 移除,原来靠自动转义的代码要自己处理输入。each() 在 8.0 移除,foreach 里引用循环变量后要 unset。同名构造函数在 7.0 废弃,8.0 不再当构造函数,改成 __construct。
迁移的实操顺序
先把站点复制到测试机,PHP 版本从 5.6 起步,再上 7.4,之后 8.x,一级一级跳比直接上 8 好排查。打开 error_reporting(E_ALL) 和 display_errors,把 notice 清掉,很多问题在 7.x 才会变成 fatal。
用 php -l 做语法检查,全站跑一遍;再用 PHPCompatibility 这类规则扫,比人工翻快。数据库连接、文件上传、session 存储重点测,老代码常在这三块用废弃函数。
非升不可吗
5.2.6 多跑在旧版 Linux 和老 OpenSSL 上,很多支付接口、短信接口已经不支持,业务会先撑不住。短期不能升,至少放进内网或加 WAF,关掉 display_errors,别让报错暴露路径。
长期看,重写核心页面比在老框架上打补丁便宜,尤其是代码量不到两万行的站。
结论:php 5.2.6 只适合隔离环境里的遗留系统;有支付和登录的站尽快排升级,先到 5.6 再到 7.4,一步到位容易崩。