“could not find driver”本质是PHP未加载pdo_mysql驱动模块,与代码、数据库服务无关;需确认FPM环境下的php-fpm -m输出含pdo和pdo_mysql、phpinfo()中显示pdo_mysql、PDO::getAvailableDrivers()返回含mysql,且php.ini中extension=pdo_mysql未被注释,最后重启php-fpm。

“could not find driver” 就是 pdo_mysql 没启用
不是代码写错了,也不是数据库服务挂了,而是 PHP 根本没加载 pdo_mysql 这个驱动模块。哪怕 pdo 扩展开着、MySQL 服务跑着、.env 配置全对,只要缺这个扩展,Laravel 启动或执行 DB 查询时就会直接抛出 PDOException: could not find driver,页面白屏或 API 返回 500。
怎么确认 pdo_mysql 真的没开
别只看 phpinfo() 或 php -v ——它们可能只反映 CLI 环境,而 Laravel 通常跑在 FPM 下,两者加载的配置可能不同:
- 查 FPM 实际加载的扩展:
php-fpm -m | grep pdo(必须同时看到pdo和pdo_mysql) - 查当前 Web 环境的
phpinfo()页面,搜索 “pdo_mysql”,不能只搜 “pdo” - 运行
php -r "print_r(PDO::getAvailableDrivers());",输出里必须含mysql - 检查
php.ini(注意是 FPM 对应的那个)里是否有extension=pdo_mysql,且前面没加;
PHP 8.5.5 下特别容易踩的坑
PHP 8.5.5 已彻底移除旧的 mysql 扩展,mysqli 虽仍可用,但 Laravel 的 DB 类默认走的是 PDO 流程,不经过 mysqli。所以:
- 装了
mysqli≠ 能用 Laravel 数据库 ——pdo_mysql是硬性依赖 - Docker 环境里,即使基础镜像声明支持 PDO,也得确认
docker-compose.yml挂载的php.ini或自定义Dockerfile显式启用了pdo_mysql - DSN 中漏写
charset=utf8mb4不会导致 “could not find driver”,但会引发后续乱码或 emoji 插入失败 —— 这是另一个问题,别混为一谈
重启不生效?可能是多版本 PHP 冲突
常见于开发机或旧服务器:CLI 用 PHP 8.3,FPM 却在跑 PHP 8.1,而你只改了其中一个版本的 php.ini:
- 查 FPM 使用的 PHP 路径:
ps aux | grep php-fpm→ 看启动命令里的--php-ini或默认位置 - 查实际加载的配置:
php-fpm -i | grep "Loaded Configuration File" - 改完配置后,必须重启
php-fpm(不是 Apache/Nginx),例如:sudo systemctl restart php8.5-fpm
pdo 就够了,却没盯住那个具体的 pdo_mysql。


















