使用PDO与OCI8扩展时遇"could not find driver"错误求助
问题解答
关于PHP 8.1的PDO_OCI扩展
PHP 8.1需要单独安装PDO_OCI扩展,它既不包含在PHP核心中,也和你已安装的OCI8扩展相互独立:
- OCI8是基于Oracle原生OCI API的扩展,提供直接的Oracle数据库操作接口
- PDO_OCI是PDO(PHP数据对象)规范的Oracle驱动,专门用于支持PDO接口的数据库连接
你当前OCI8可用但PDO连接失败,核心原因就是缺少PDO_OCI驱动。
在Ddev容器中安装并启用PDO_OCI
由于Debian/Ubuntu官方apt源没有预编译的PDO_OCI包,需要手动编译安装,步骤如下:
- 进入Ddev容器
ddev ssh
- 安装编译依赖
apt update && apt install -y php8.1-dev build-essential libaio-dev
- 下载对应版本的PHP源码(以PHP 8.1.29为例,替换为你实际的PHP 8.1子版本)
cd /tmp wget https://www.php.net/distributions/php-8.1.29.tar.gz tar xzf php-8.1.29.tar.gz cd php-8.1.29/ext/pdo_oci
- 编译配置(注意替换
19.18为你的Oracle Instant Client版本号,比如19c对应19.x,21c对应21.x)
phpize ./configure --with-pdo-oci=instantclient,/opt/oracle/instantclient,19.18
- 编译并安装扩展
make && make install
- 启用扩展(同时配置CLI和FPM环境)
echo "extension=pdo_oci.so" > /etc/php/8.1/cli/conf.d/20-pdo_oci.ini cp /etc/php/8.1/cli/conf.d/20-pdo_oci.ini /etc/php/8.1/fpm/conf.d/
- 重启PHP-FPM服务
service php8.1-fpm restart
- 验证安装成功
php -m | grep pdo_oci
如果输出pdo_oci,说明扩展已启用。
持久化配置(避免容器重建后丢失)
Ddev容器重启或重建后,上述修改会被重置,建议将编译步骤写入Ddev的启动钩子:
在.ddev/config.yaml中添加以下内容:
hooks: post-start: - exec: | apt update && apt install -y php8.1-dev build-essential libaio-dev if ! php -m | grep -q pdo_oci; then cd /tmp wget -q https://www.php.net/distributions/php-8.1.29.tar.gz tar xzf php-8.1.29.tar.gz cd php-8.1.29/ext/pdo_oci phpize ./configure --with-pdo-oci=instantclient,/opt/oracle/instantclient,19.18 make && make install echo "extension=pdo_oci.so" > /etc/php/8.1/cli/conf.d/20-pdo_oci.ini cp /etc/php/8.1/cli/conf.d/20-pdo_oci.ini /etc/php/8.1/fpm/conf.d/ service php8.1-fpm restart fi
内容的提问来源于stack exchange,提问作者JonMcL
相关产品推荐
相关产品推荐

