Bitnami LAMP栈PHP7.3启用pdo_pgsql报undefined symbol错误求助
问题背景
使用Bitnami LAMP栈(PHP7.3,Ubuntu20.04),尝试启用pdo_pgsql扩展时失败,执行php -m报错:
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_pgsql.so' (tried:
/opt/bitnami/php/lib/php/extensions/pdo_pgsql.so
(/opt/bitnami/php/lib/php/extensions/pdo_pgsql.so: undefined symbol: pdo_throw_exception),
/opt/bitnami/php/lib/php/extensions/pdo_pgsql.so.so
(/opt/bitnami/php/lib/php/extensions/pdo_pgsql.so.so: cannot open shared object file: No
such file or directory)) in Unknown on line 0
此前通过系统APT仓库安装扩展并复制.so文件的方法在PHP8.0环境可行,但PHP7.3下因二进制兼容性问题失效。
错误原因
Bitnami的PHP是独立编译的隔离环境,与系统APT安装的PHP编译参数、依赖库版本完全不一致。直接复制APT安装的pdo_pgsql.so文件到Bitnami目录,会出现符号缺失(如pdo_throw_exception),导致扩展无法加载。
解决方案
方案1:使用Bitnami自带PECL工具安装(推荐)
Bitnami提供了适配自身PHP环境的PECL工具,可直接编译安装兼容的扩展:
- 执行Bitnami的PECL命令安装pdo_pgsql:
sudo /opt/bitnami/php/bin/pecl install pdo_pgsql- 若提示指定PostgreSQL路径,根据实际情况输入:
- 若使用Bitnami自带的PostgreSQL:
--with-pdo-pgsql=/opt/bitnami/postgresql - 若使用系统APT安装的PostgreSQL(Ubuntu20.04默认是12版本):
--with-pdo-pgsql=/usr/lib/postgresql/12
- 若使用Bitnami自带的PostgreSQL:
- 若提示指定PostgreSQL路径,根据实际情况输入:
- 安装完成后,工具会自动在
/opt/bitnami/php/etc/php.ini中添加扩展配置,若未自动添加,手动添加一行:extension=pdo_pgsql.so - 重启Bitnami Apache服务:
sudo /opt/bitnami/ctlscript.sh restart apache - 验证扩展是否加载:
/opt/bitnami/php/bin/php -m | grep pdo_pgsql
方案2:手动编译扩展(PECL安装失败时使用)
手动下载对应PHP版本的源码,用Bitnami的编译工具编译适配的扩展:
- 下载与Bitnami PHP7.3匹配的PHP源码(先通过
/opt/bitnami/php/bin/php -v确认具体版本,比如7.3.33):cd /tmp wget https://www.php.net/distributions/php-7.3.33.tar.gz tar -xzf php-7.3.33.tar.gz cd php-7.3.33/ext/pdo_pgsql - 用Bitnami的phpize初始化编译环境:
/opt/bitnami/php/bin/phpize - 配置编译参数(指定Bitnami的PHP配置和PostgreSQL路径):
./configure --with-php-config=/opt/bitnami/php/bin/php-config --with-pdo-pgsql=/usr/lib/postgresql/12 - 编译并安装:
make && sudo make install - 手动在
/opt/bitnami/php/etc/php.ini添加扩展配置,重启Apache后验证(同方案1步骤3-4)。
关键注意事项
- 禁止直接使用系统APT安装的PHP扩展文件,必须针对Bitnami PHP环境编译或通过其自带工具安装。
- 操作时确保使用Bitnami PHP的绝对路径(
/opt/bitnami/php/bin/下的工具),避免调用系统PHP的命令。
内容的提问来源于stack exchange,提问作者Ivan Polak

