必须使用php5.6.40+apache2.4.38+vc11组合,因thinkphp3.2等老框架依赖mysql_*函数和vc11运行时,php7+已移除相关函数,apache2.4.39+改用vc15编译导致不兼容。

老项目跑不起来,八成是PHP版本没配对。不是随便装个新PHP就能用,关键得找对“老搭档”——版本组合、运行库、扩展配置,一个都不能错。
锁定匹配的PHP+Apache版本
ThinkPHP3.2、Yii1.1这类老框架依赖的是PHP5.6时代的语法和函数(比如mysql_*),新版PHP直接砍掉了这些。硬上PHP7或8,必然报错。
- PHP必须用5.6.40(最后稳定版,兼容性好、漏洞已修复)
- Apache必须用2.4.38(最后一个VC11编译版,和PHP5.6的运行时完全匹配)
- 配套安装Visual C++ 2012 Redistributable(VC11),缺它Apache根本加载不了php模块
启用被弃用但必需的扩展
老代码里大量调用mysql_connect()、ereg()等函数,PHP5.6默认可能没开对应扩展,得手动激活。
- 打开
php.ini,取消注释:extension=php_mysql.dll和extension=php_mysqli.dll(有些老项目只认mysql) - 若用到正则,补上:
extension=php_pcre.dll - 错误报告先调低一点:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE,避免满屏警告干扰调试
代码层最小干预修复
不建议一上来就重写,优先用“兜底方案”让系统先跑起来:
- 用
function_exists()判断函数是否存在,再分支调用,例如:if (function_exists('mysqli_connect')) { ... } else { ... } - 对
@错误抑制符,暂时保留,但加日志记录,后续再逐个替换为try/catch - 把
create_function()替换成匿名函数:function($a) { return $a + 1; }
验证与过渡建议
环境搭完别急着上线,走三步确认:
- 命令行跑
php -v和httpd -v,确保版本号完全一致 - 放一个
phpinfo()页面,检查mysql/mysqli扩展是否真加载成功 - 本地用Docker拉个PHP5.6镜像做平行验证,排除Windows环境特有问题
能跑通再考虑逐步升级——比如先迁移到PHP7.4(支持mysqli和PDO),再进阶到PHP8.x。历史遗留系统,稳比快重要。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











