PHP CLI与Web环境配置分离导致php -m看不到pdo_mysql而phpinfo()显示正常;需分别检查对应php.ini路径、extension配置及扩展文件加载位置。

为什么php -m看不到pdo_mysql但phpinfo()里有?
这是最常被忽略的“假成功”:PHP CLI(命令行)和 Web SAPI(比如 Apache 或 Nginx 的 PHP-FPM)用的是两套配置,php.ini路径可能完全不同。ThinkPHP 安装检测走的是 Web 环境,但你运行php -m查的是 CLI 的模块列表——两者不一致,就会误判为“扩展没装”。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先确认 Web 环境实际加载的
php.ini路径:在 Web 页面中写<?php phpinfo(); ?>,搜索 “Loaded Configuration File” - 再检查该
php.ini文件里是否已启用extension=pdo_mysql(注意不是pdo.so或mysql.so) - 如果已启用但仍报错,说明模块文件根本没编译进 PHP,或路径不对(如
extension_dir指向错误目录)
编译安装pdo_mysql前必须确认的三个依赖
直接./configure --with-pdo-mysql失败,90% 是卡在这三样没到位,而不是参数写错。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
mysql_config命令必须存在且可用:它提供 MySQL 头文件和库路径。Ubuntu/Debian 上装libmysqlclient-dev,CentOS/RHEL 上装mysql-devel - PHP 源码必须完整保留:
ext/pdo_mysql/目录不能删,否则make会跳过该扩展 - 不要单独编译
pdo_mysql:它依赖pdo主扩展,必须一起编译(即--enable-pdo --with-pdo-mysql同时出现)
./configure 参数怎么写才不踩坑
常见错误是照抄旧教程,把 --with-mysql(已废弃)或 --with-pdo-mysql=/usr(路径太宽泛)硬套进来,结果编译通过但运行时报 Class 'PDO' not found。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用绝对路径指定
mysql_config,例如:--with-pdo-mysql=/usr/bin/mysql_config(先用which mysql_config确认) - 显式启用 PDO:加上
--enable-pdo,不能只靠--with-pdo-mysql自动触发 - 如果 MySQL 是 MariaDB 或 Percona,仍用
--with-pdo-mysql,但确保mysql_config来自对应发行版(MariaDB 的叫mysql_config,不是mariadb_config)
编译后pdo_mysql.so放哪、怎么加载
编译完只生成 modules/pdo_mysql.so,但很多人直接把它拷到 /usr/lib/php/.../ 下,却忘了改 php.ini——或者改了 CLI 的 php.ini,忘了改 FPM 的。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
php-config --extension-dir查当前 PHP 的扩展目录,把pdo_mysql.so放进去(别手动猜路径) - 在 Web 对应的
php.ini中加一行:extension=pdo_mysql(不带.so,PHP 7.4+ 会自动补) - 重启 PHP-FPM 或 Apache:
systemctl restart php-fpm(不是nginx或httpd) - 验证:访问
phpinfo()页面,搜 “PDO drivers”,看到mysql就对了
最容易被忽略的是:PHP-FPM 的子进程可能缓存了旧的模块状态,哪怕改了 php.ini 也得彻底 kill 进程再启,光 reload 不够。



















