解决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就行:
    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版本完整的步骤如下

  1. 切换cli运行模式默认的PHP版本:
    sudo update-alternatives --config php
    选择PHP7.4即可
  1. 切换phpize版本:
    sudo update-alternatives --config phpize
    选择7.4版本
  1. 切换php-config版本

    sudo update-alternatives --config php-config

    同样选择7.4版本

  2. 切换phpdbg版本

    sudo update-alternatives --config phpdbg

    同样选择7.4版本

  3. 现在重新看一下跟php有关的环境变量:

    ls -lha /etc/alternatives | grep php

    运行结果
    运行结果显示,所有php相关环境变量都变成7.4版本的了。

  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
  5. 编译完成后,将 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 协议》,转载必须注明作者和本文链接
顺势而为
本帖由系统于 2年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

已收藏,说不定下次用上了

3年前 评论

安装7.4用了多久 :confused:

3年前 评论
myhui0926 (楼主) 3年前

还是没能解决,一样提示冲突 只能装一个版本😭

1年前 评论
xiaopi

补充一点,多个php版本装同一个扩展时,会提示扩展已经存在。解决方法是执行上述1-5步后,执行“软卸载”刚才的包,即卸载包,但是不删除xxx.so文件。这样再次切换到其他版本后,安装同一个扩展,就不会提示扩展存在了。两个php都正常用该扩展

# 切换7.4环境
$ pecl -d php_suffix=7.4 install swoole
$ pecl uninstall -r swoole # 删除包 但是不删除swoole.so

# 切换8.0环境
$ pecl -d php_suffix=8.0 install swoole
$ pecl uninstall -r swoole

# 切换8.1环境
$ pecl -d php_suffix=8.1 install swoole
$ pecl uninstall -r swoole
2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!