我有一台运行 Ubuntu 22.04 的服务器,它使用
ondrej:ppa
安装了多个版本的 PHP。我需要向所有支持的版本添加 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"
对一个版本的 PHP 执行此操作一切正常。当我尝试执行不同版本的 php 时,扩展也可以正常构建,但以前使用的 php 版本的扩展被删除了???
我显然在这里做错了什么。
我认为你的问题是 PECL 创建了一个它认为当前安装的注册表文件,因此一旦你切换到不同的 PHP 版本,该注册表文件就不再合适。在每个构建步骤之后,删除 PECL 刚刚创建的注册表文件:
rm /usr/share/php/.registry/.channel.pecl.php.net/oci8.reg
或者,您可以手动构建包:
pecl download oci8-3.3.0
tar xzf oci8-3.3.0.tgz
cd oci8-3.3.0
phpize
./configure --with-oci8=instantclient,/path/to/dir
make
mv modules/oci8.so $(php-config --extension-dir)
然后您还必须手动调整 php.ini 来加载模块。