phpenv默认不启用pdo_sqlite扩展,必须手动编辑对应版本php.ini取消extension=pdo_sqlite和extension=sqlite3的注释,执行phpenv rehash后验证pdo_sqlite是否在pdo::getavailabledrivers()中。

phpEnv 默认不启用 PDO_SQLite 扩展,必须手动开启才能用 PDO 连 SQLite 数据库文件。不启用就直接 new PDO('sqlite:db.db') 会报 could not find driver 错误。
确认 phpEnv 当前 PHP 版本和扩展目录
phpEnv 是多版本 PHP 环境管理工具,不同 PHP 版本的 php.ini 和扩展路径彼此隔离。先查清你当前激活的是哪个版本:
phpenv version 或 php -v 查看版本号(如 8.2.12);
php --ini 显示加载的 php.ini 路径,通常是类似 ~/.phpenv/versions/8.2.12/etc/php.ini 的位置;
php -r "echo ini_get('extension_dir');" 确认扩展所在目录,例如 ~/.phpenv/versions/8.2.12/lib/php/extensions/no-debug-zts-20220829/。
别直接改系统级 /etc/php/*/cli/php.ini —— 那对 phpEnv 无效。
编辑对应版本的 php.ini 并启用扩展
找到上一步确认的 php.ini 文件,用文本编辑器打开,搜索以下两行:
;extension=pdo_sqlite;extension=sqlite3
把分号去掉,变成:
extension=pdo_sqliteextension=sqlite3
注意:两者都要开。pdo_sqlite 是 PDO 驱动,sqlite3 是底层支持,缺一不可;
如果搜不到这两行,说明该 PHP 版本编译时没内置,需手动下载对应 .so(Linux/macOS)或 .dll(Windows)文件放进 extension_dir,再添加 extension 行;
保存后,**必须重新加载 phpEnv 环境**:phpenv rehash,否则 php -m 仍看不到扩展。
验证 pdo_sqlite 是否生效
运行命令快速验证:
php -m | grep -i sqlite —— 应同时输出 pdo_sqlite 和 sqlite3;
php -r "var_dump(PDO::getAvailableDrivers());" —— 输出数组里必须含 "sqlite";
写个最小测试脚本 test-sqlite.php:
try {
$pdo = new PDO('sqlite::memory:');
echo "PDO + SQLite 已就绪\n";
} catch (PDOException $e) {
echo "失败: " . $e->getMessage() . "\n";
}
执行 php test-sqlite.php,输出“已就绪”才算真正可用;
如果报错 unable to open database file,不是扩展问题,而是路径权限或相对路径解析错误(比如 CLI 下工作目录和 Web 目录不一致),此时应改用绝对路径如 sqlite:/tmp/test.db 测试。
常见踩坑点:WAL 模式与并发写入
SQLite 在 phpEnv 的 CLI 场景下常被用于脚本工具或本地开发服务,但默认是 DELETE 模式,高并发写入易触发 database is locked;
可在连接后立即启用 WAL 模式缓解:
$pdo->exec("PRAGMA journal_mode = WAL");
注意:WAL 模式要求数据库文件所在目录可写,且不能跨文件系统挂载(比如某些 Docker volume 映射会禁用 fsync);
另一个隐形坑:phpEnv 启动的 PHP-FPM 或内置服务器(php -S)默认不共享 SQLite 连接,每个请求都是新连接,频繁 open/close 文件会放大锁竞争 —— 此类场景建议加一层轻量队列或改用内存数据库临时表。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











