Ubuntu服务器为多版本PHP构建oci8扩展时旧版本扩展丢失求助
解决多版本PHP安装oci8扩展时旧版本扩展被删除的问题
问题背景
搭载Ubuntu 22.04的服务器,通过ondrej:ppa安装了PHP 7.4和8.0多个版本,执行以下脚本为单个版本安装oci8扩展时正常,但为第二个版本安装后,之前版本的oci8扩展被删除:
phpver='7.4' builddir="/build$phpver" instpath='/opt/oracle/instantclient_21_12' [ "$phpver" = '7.4' ] && oci8version='oci8-2.2.0' [ "$phpver" = '8.0' ] && oci8version='oci8-3.0.1' update-alternatives --set php "/usr/bin/php${phpver}" && \ update-alternatives --set phpize "/usr/bin/phpize${phpver}" && \ update-alternatives --set php-config "/usr/bin/php-config${phpver}" && \ rm -f "/etc/php/${phpver}/mods-available/oci8.ini" && \ touch "/etc/php/${phpver}/mods-available/oci8.ini" && \ pear config-set php_ini "/etc/php/${phpver}/mods-available/oci8.ini" && \ mkdir -pv "$builddir" && \ pear config-set temp_dir "$builddir" && \ pecl install -f --configureoptions "with-oci8=\"instantclient,$instpath\"" "$oci8version" && \ phpenmod -v "${phpver}" oci8 pear config-set php_ini '' pear config-set temp_dir '' rm -rf "$builddir"
问题原因
脚本依赖update-alternatives切换全局PHP环境,虽然切换了php、phpize、php-config,但全局的pecl命令本质上仍与特定PHP版本绑定,且修改全局pear配置时可能干扰其他版本的扩展文件或配置,导致安装新版本时覆盖旧版本的oci8扩展。
解决方法
放弃全局环境切换,直接使用对应PHP版本的专属工具命令(如pecl7.4、phpize7.4),实现各版本扩展安装的完全隔离。修改后的脚本如下:
phpver='7.4' # 切换为8.0即可为对应版本安装 builddir="/build$phpver" instpath='/opt/oracle/instantclient_21_12' [ "$phpver" = '7.4' ] && oci8version='oci8-2.2.0' [ "$phpver" = '8.0' ] && oci8version='oci8-3.0.1' # 指定对应版本的专属工具路径 PHPIZE="/usr/bin/phpize${phpver}" PHPCONFIG="/usr/bin/php-config${phpver}" PECL="/usr/bin/pecl${phpver}" rm -f "/etc/php/${phpver}/mods-available/oci8.ini" && \ touch "/etc/php/${phpver}/mods-available/oci8.ini" && \ ${PECL} config-set php_ini "/etc/php/${phpver}/mods-available/oci8.ini" && \ mkdir -pv "$builddir" && \ ${PECL} config-set temp_dir "$builddir" && \ ${PECL} install -f --configureoptions "with-oci8=\"instantclient,$instpath\"" "$oci8version" && \ phpenmod -v "${phpver}" oci8 ${PECL} config-set php_ini '' ${PECL} config-set temp_dir '' rm -rf "$builddir"
额外验证步骤
若旧版本扩展已被删除,运行上述修改后的脚本重新安装即可。可通过以下命令检查各版本oci8扩展是否存在:
- PHP 7.4:
ls /usr/lib/php/20190902/oci8.so - PHP 8.0:
ls /usr/lib/php/20200930/oci8.so
内容的提问来源于stack exchange,提问作者Darko Miletic
相关产品推荐
相关产品推荐

