Codespaces中首次安装php8.2-pgsql失败,操作是否存在问题?
问题背景
我在Codespaces开发Symfony项目,安装pdo_pgsql驱动对接PostgreSQL时遇到路径不匹配的问题,最终找到可行解决办法,但不清楚问题成因及操作是否有误。
操作流程与报错
安装驱动步骤
- 添加PHP源并安装扩展:
sudo add-apt-repository ppa:ondrej/php sudo apt-get update sudo apt-get upgrade sudo apt-get install php8.2-pgsql - 查找并编辑php.ini启用扩展:
编辑php.ini取消注释:php --iniextension=pdo_pgsql - 验证扩展激活状态:
php -m | grep pdo_pgsql php -i | grep pgsql
报错信息
执行验证命令时出现以下警告:
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_pgsql' (tried: /opt/php/8.2.5/lib/php/extensions/no-debug-non-zts-20220829/pdo_pgsql (/opt/php/8.2.5/lib/php/extensions/no-debug-non-zts-20220829/pdo_pgsql: cannot open shared object file: No such file or directory), /opt/php/8.2.5/lib/php/extensions/no-debug-non-zts-20220829/pdo_pgsql.so (/opt/php/8.2.5/lib/php/extensions/no-debug-non-zts-20220829/pdo_pgsql.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
解决步骤
找到库文件并复制到PHP预期路径:
find / -name "pdo_pgsql.so" 2>/dev/null cp /usr/lib/php/20220829/pdo_pgsql.so /opt/php/8.2.5/lib/php/extensions/no-debug-non-zts-20220829/ chmod +wx /opt/php/8.2.5/lib/php/extensions/no-debug-non-zts-20220829/*
再次验证,警告消失,扩展正常识别。
疑问解答
问题成因
Codespaces基础镜像中预装了一个独立PHP版本(路径为/opt/php/8.2.5/),其默认扩展目录为/opt/php/8.2.5/lib/php/extensions/no-debug-non-zts-20220829/;而你通过PPA安装的php8.2-pgsql扩展,默认会被放到系统级的PHP扩展目录/usr/lib/php/20220829/(20220829是PHP 8.2的扩展API版本号)。两个环境的路径不匹配,导致当前使用的PHP找不到扩展文件。
操作是否存在错误
你的操作能解决问题,但不算最优方案,有几个可优化的点:
- 无需复制文件,直接指定扩展路径:在php.ini中直接写入扩展的完整路径即可,比如:
这样能避免后续PHP升级时,复制的旧文件与新版本不兼容的问题。extension=/usr/lib/php/20220829/pdo_pgsql.so - 优先匹配当前PHP环境的安装方式:先通过
which php确认当前使用的PHP可执行文件路径,若为/opt下的版本,更推荐用该PHP自带的pecl命令安装扩展:
这样扩展会直接安装到该PHP的默认扩展目录,无需手动调整路径。pecl install pdo_pgsql - 权限设置冗余:
chmod +wx给扩展目录所有文件加可写权限没必要,扩展文件仅需读权限,设置chmod +r足够,避免不必要的权限风险。
整体操作逻辑是正确的,核心思路是让PHP定位到扩展文件,成功解决了问题,只是存在优化空间。
内容的提问来源于stack exchange,提问作者Adrián

