解决Homestesd中更换PHP版本后,PECL安装扩展遇到的PHP版本问题
这两天想把homestead的PHP版本改成7.4,试试PHP7.4新加的特性。大家都知道PHP的运行模式目前主要有两种,php-fpm模式和cli模式。
而我们使用pecl安装PHP扩展(例如swoole,redis)的时候会用到phpize,依赖PHP的cli运行环境。今天在切换cli运行环境下的PHP版本的时候就踩到坑了,写出来分享给大家,希望能够为大家节省时间。
我们更改homestead的PHP版本时,要分别更改fpm和cli两种运行模式下的PHP版本:
php-fpm模式更改PHP版本
- 方式一:直接改nginx配置文件
fpm模式的PHP版本变更很简单,只要将nginx与php-fpm的通讯socket改成php-7.4.sock,然后重启nginx就行: - 方式二:修改Homestead.yaml文件
sites: - map: zztms.test to: /home/vagrant/code/zztms/public php: "7.4"
CLI执行环境的PHP版本切换。
很多教程都是使用两个命令即可:
update-alternatives --display php //查看所有 php 版本和当前版本
update-alternatives --config php //执行后,会列出当前 php 所有版本和编号,输入编号,切换到执行的版本
假设我把PHP版本从7.3切换成了7.4,是否可以直接通过pecl安装PHP扩展了呢,没那么简单!(需要直接正确更改PHP版本的直接跳到最后看步骤)。现在我要使用pecl安装swoole扩展,直接执行命令:
pecl install swoole
然后发现编译采用的api版本依然是php7.3的:
376 source files, building
running: phpize
Configuring for:
PHP Api Version: 20180731
Zend Module Api No: 20180731
Zend Extension Api No: 320180731
这当然不行了。直接 Ctrl + C 结束安装。
其实主要问题出在PHP编译环境上,编译环境默认还是php7.3的。所以除了切换PHP本身的版本,PHP扩展的编译环境也要相应切换。
所以更换CLI运行模式下的PHP版本完整的步骤如下
- 切换cli运行模式默认的PHP版本:
选择PHP7.4即可sudo update-alternatives --config php
- 切换phpize版本:
选择7.4版本sudo update-alternatives --config phpize
切换php-config版本
sudo update-alternatives --config php-config
同样选择7.4版本
切换phpdbg版本
sudo update-alternatives --config phpdbg
同样选择7.4版本
现在重新看一下跟php有关的环境变量:
ls -lha /etc/alternatives | grep php
运行结果显示,所有php相关环境变量都变成7.4版本的了。现在重新运行pecl安装扩展命令:
sudo pecl install swoole
可以看到,此时编译安装扩展采用的api变成PHP7.4的了:
376 source files, building running: phpize Configuring for: PHP Api Version: 20190902 Zend Module Api No: 20190902 Zend Extension Api No: 320190902
编译完成后,将 extension=swoole.so 添加到swoole.ini文件:
- 创建配置文件:
sudo vim /etc/php/7.4/mods-available/swoole.ini
- 写入配置:
extension=swoole.so
- 通过软链接启用配置:
sudo ln -s /etc/php/7.4/mods-available/swoole.ini /etc/php/7.4/cli/conf.d/20-swoole.ini
- 现在运行:
可以看到扩展已安装成功了。php -m | grep swoole
本作品采用《CC 协议》,转载必须注明作者和本文链接
已收藏,说不定下次用上了
安装7.4用了多久 :confused:
还是没能解决,一样提示冲突 只能装一个版本😭
补充一点,多个php版本装同一个扩展时,会提示扩展已经存在。解决方法是执行上述1-5步后,执行“软卸载”刚才的包,即卸载包,但是不删除xxx.so文件。这样再次切换到其他版本后,安装同一个扩展,就不会提示扩展存在了。两个php都正常用该扩展