PHP 7.1更新后CLI环境PDO及pdo_pgsql扩展缺失问题
这种情况我之前处理过,核心原因是PHP CLI和FPM属于两个独立的运行环境,它们可能加载不同的php.ini配置文件,ppa源更新时大概率只同步了FPM的配置,没对CLI的配置做相同处理,导致CLI里的扩展启用规则被重置或者没跟上。
下面是一步步的排查和解决方法:
1. 确认PHP版本一致性
首先要确保你用的CLI和FPM是同一个PHP7.1版本,避免多版本PHP共存导致的混淆:
- 查看CLI版本:
php -v - 查看FPM版本:
php-fpm7.1 -v(如果你的FPM服务名是php7.1-fpm,也可以用service php7.1-fpm status查看版本)
如果版本不一致,说明系统里装了多个PHP版本,需要切换CLI到7.1版本,执行update-alternatives --config php选择对应的7.1选项即可。
2. 对比CLI和FPM的配置文件路径
找到两个环境各自加载的php.ini文件:
- CLI的配置文件:
php --ini,重点看Loaded Configuration File这一行,通常路径是/etc/php/7.1/cli/php.ini - FPM的配置文件:
php-fpm7.1 -i | grep "Loaded Configuration File",通常路径是/etc/php/7.1/fpm/php.ini
3. 同步扩展启用配置
打开CLI的php.ini文件,对比FPM的php.ini里的扩展部分,找到以下两行(FPM里肯定是启用状态):
extension=pdo_pgsql.so extension=pgsql.so
如果CLI的php.ini里这两行被注释了(前面有;),就去掉注释;如果没有,就手动添加进去。
另外还要检查扩展目录是否一致:
- CLI的扩展目录:
php -i | grep extension_dir - FPM的扩展目录:
php-fpm7.1 -i | grep extension_dir
如果不一致,在CLI的php.ini里设置extension_dir为和FPM相同的路径,比如:
extension_dir = "/usr/lib/php/20160303"
4. 验证扩展是否加载
修改配置后,执行php -m查看已加载的扩展列表,确认pdo_pgsql和pgsql出现在列表里。如果还是没出现,可能需要重新安装对应的扩展包:
sudo apt-get update sudo apt-get install php7.1-pgsql php7.1-pdo-pgsql
(虽然FPM已经有了,但CLI的扩展包可能在更新时被意外卸载,重装可以确保两个环境都能加载对应扩展)
5. 测试CLI命令
重新执行之前报错的命令,比如Laravel的数据库操作,应该不会再抛出could not find driver的异常了。
补充:ppa源的PHP包通常会把CLI和FPM的配置分开放在
/etc/php/7.1/cli/和/etc/php/7.1/fpm/目录下,更新时有时候会用默认配置覆盖CLI的自定义配置,所以以后更新PHP后最好检查下CLI的配置文件是否被重置。
内容的提问来源于stack exchange,提问作者Jan Wytze

