phpEnv不自带SQLite,需确认PHP版本是否编译启用sqlite3和pdo_sqlite扩展;若未启用,须重装带--with-sqlite3和--with-pdo-sqlite参数的PHP版本或改用XAMPP等集成环境。

phpEnv 本身不自带 SQLite,也不负责安装或启用 PHP 的 SQLite 扩展——它只是个 PHP 版本管理工具,类似 pyenv 或 nvm。真正要让 PHP 连上 SQLite,得靠你本地的 PHP 构建时是否启用了 sqlite3 和 pdo_sqlite 扩展,以及 phpEnv 是否指向了那个“带扩展”的 PHP 版本。
确认当前 phpEnv 使用的 PHP 是否支持 SQLite
很多人以为装了 phpEnv 就自动有 SQLite,结果 new SQLite3('test.db') 报错 Class not found,其实是 PHP 二进制没编译进 sqlite 支持。
- 运行
phpenv which php看当前激活的 PHP 路径,比如/home/you/.phpenv/versions/8.2.12/bin/php - 用这个完整路径检查扩展:
/home/you/.phpenv/versions/8.2.12/bin/php -m | grep -i sqlite - 必须同时看到
sqlite3和pdo_sqlite;只有一项,PDO 连接会报could not find driver,SQLite3 类则可能直接不可用 - 如果没输出,说明该 PHP 版本编译时没加
--with-sqlite3和--with-pdo-sqlite,phpEnv 无法后期“注入”扩展——你得换一个预编译好 SQLite 的版本,或自己源码编译
用 phpEnv 安装一个带 SQLite 的 PHP 版本(Linux/macOS)
phpEnv 默认安装的 PHP 通常不含 SQLite,尤其 macOS 上用 Homebrew 编译的版本容易漏掉依赖。必须显式指定 --configure-options。
- 先确保系统已装 SQLite 开发库:
sudo apt install libsqlite3-dev(Ubuntu/Debian)或brew install sqlite3(macOS) - 安装时传入完整配置参数(关键!):
phpenv install 8.2.12 --configure-options="--with-sqlite3 --with-pdo-sqlite" - 装完后
phpenv global 8.2.12切换,并再次用php -m | grep sqlite验证 - Windows 用户注意:phpEnv 在 Windows 上基本不可用,应改用 XAMPP、Laragon 或直接下载官方 Windows PHP 包(自带
php_sqlite3.dll和php_pdo_sqlite.dll)
PHP 脚本里连 SQLite:PDO 和 SQLite3 类怎么选
不是“哪个更简单”,而是“哪个更可控”。两者底层都调 SQLite C 库,但错误暴露程度和默认行为差异很大。
- 用
PDO:DSN 写成sqlite:/abs/path/to/db.sqlite,必须设PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则SQLSTATE[HY000]这种错误你根本看不出是表不存在还是字段名写错了 - 用
SQLite3类:new SQLite3(__DIR__ . '/data/app.db')会静默创建文件,但若data/目录不存在或权限不对,就报unable to open database file—— 错误信息不提示缺目录,只说打不开 - 两者都要求数据库文件所在目录对 Web 服务器用户(如
www-data或_www)可写;用 phpEnv 本地 CLI 测试时,就是当前 shell 用户要有写权限 - 别在脚本里用相对路径如
'db.sqlite':CLI 下 cwd 是执行命令的目录,Web 下是入口脚本所在目录,极易错位
最容易被忽略的坑:WAL 模式和并发写入
SQLite 默认用 rollback journal,一写就锁整个库。在 phpEnv 搭的本地开发环境里跑多个请求(比如前端发两个 AJAX),第二个请求会卡住甚至超时,但错误日志里往往只有 database is locked,没提示是 WAL 关闭导致的。
- PDO 方式开启 WAL:
$pdo->exec("PRAGMA journal_mode = WAL");,必须在连接后立即执行,且仅对当前连接生效 - SQLite3 类方式:
$db->exec("PRAGMA journal_mode = WAL");,同样需在建表前调用 - WAL 模式下,读不阻塞写,但需要额外的
-wal和-shm临时文件,确保目录可写(很多 Docker 或权限受限环境会因此失败) - 别指望
VACUUM自动运行——它会阻塞写入,且不能在 WAL 模式下直接执行,得先PRAGMA journal_mode = DELETE
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











