win64下多版本PHP(v7.3 ~ v8.2)安装 ----- 踩过一坑记录Unable to initialize module

由于最近开始想玩PHP8,而我本地开发环境是php7.3(x64),而docker在windows又很不友好体验很差劲(貌似还开始收费),所以我更愿意使最原始的开发环境:httpd(apache24) + php73 + mysql8。官网下载了php8 (https://windows.php.net/download/), ts-x64-VS16总之版本适配。然后开始配置:复制php.ini;设置extesions_dir=“ext”;开启扩展;httd.conf设置扩展加载;一套操作行云流水, cmd执行

```

php -m # 所有扩展正确加载

php -v # 版本v8

```

然后去浏览器执行phpinifo()的脚本,ok

But

 

发现PDO扩展没加载

奇怪,去查看apache的启动错误日志,发现

所有扩展加载失败,提示“PHP API”与“Module API”版本不符合。当时的心情是WTF,官网下载的PHP不可能这样子啊!后来又把PHP7.4~8.2都下载配置了一边,甚至把x86的都下来了,还把httpd最新版也下载重新安装服务。搞了一天多查阅了国内外网站,最终所有的报错都是一致如上图。

抱着侥幸心里,去胡乱设置,最终定位到原因:

extension_dir = "ext" ;此处不能用相对路径,改成绝对路径一切正常了

后记:

回过头来反推问题,直接原因是“无论php版本怎么切换,extension_dir设置的相对路径始终让php去php73的ext目录找扩展”。但是本质原因呢,它为什么不去当前目录下的ext找,而要去php73下的ext找,刚开始怀疑是受环境变量Path的影响(原先Path设置php指向7.3),但是经验告诉我不应该是这个原因,事实也的确如此,即使改了环境变量也错误依旧,说明问题还是在其它地方。暂时是确定不了了,不知道哪步哪里缓存了路径吧。

希望知道的人能给我留言那

 

-------------------------------------------------------------------------------

2023-03-08补充

昨天由于测试需要,频繁切换php版本

```

LoadModule php_module xxxxxx
PHPIniDir  xxxxxx

```

频繁设置PHP环境变量目录指向。

最后莫名其妙httpd无法重启成功,有时候所有php版本都不行,有时候部分php版本可以重启。

经过长时间的检查后发现一个奇怪的现象:打印phpinfo(),看到LoadModule和PHPIniDir配置的php版本(8.1.14)和PHP_VERSION(8.0.27)显示的版本不一致,尝试修改LoadModule和PHPIniDir为7.3后重启,phpinfo()依旧看到的是8.1.14。

乖乖,去检查phpinfo() Environment下的path,发现有两个php的环境变量。终于有眉目了,不是我设置错误而是环境变量有缓存。

我猜测重启就能解决问题,事实也果然如此。

总结:在涉及php版本切换或环境变量指向切换时,更改完成最好能重启下系统以保证切换成功。

 

如下的老兄也遇到我这个问题

https://bbs.csdn.net/topics/390006194

 

posted @ 2023-01-16 12:31  下班闪电去打卡  阅读(271)  评论(0编辑  收藏  举报