php sqlite3 busytime,在使用SQLite3时遇到的几个坑

528894022dce634b2c4c220b17d0d1ce.png

这是我在一个SQLite3数据库上执行exec时遇到的奇怪问题!

本打算在SQLite3数据库里执行一个查询语句,使用的是php语言,起初遇到的是权限问题: permission denied,因为SQLite3数据库文件和PHP执行者属于两个不同的用户,首先需要对这个文件执行mode 777的权限开放,然后,又遇到了下面这样的PHP错误:

"SQLite3::exec(): unable to open database file in ...."

多试试几次后偶然也会出现”database locked”的错误提示。

经过了糟心的无数次各种方式的debugging后,最后才发现,需要将SQLite3数据库文件所在的目录的权限也开放给php执行者的用户。

这显然是毫无意义的,然而这就是报错的根源。

至少错误提示信息应该更清晰些吧。

不清楚为什么SQLite3需要开放整个目录的权限,而不是单个数据库文件的权限,有点愚蠢,是个bug?

还有一个问题就是”database locked”的错误。有时候是因为多个程序同时操作一个数据库导致的数据锁。

这个时候需要使用一些SQLite3的特别命令(i.e. using PRAGMA keyword)。例如,在解决我遇到的”database locked”问题上,我是将journal_mode的缺省的delete值替换成wal,你可以在 https://www.sqlite.org/wal.html里查看相关文档(看 Activating And Configuring WAL Mode部分)。

需要做的就是创建一个链接,使用sql语句设置journal_mode属性,就像下面这样:

$db = new SQLite3('/my/sqlite/file.sqlite3');

$db->busyTimeout(5000);

// WAL mode has better control over concurrency.

// Source: https://www.sqlite.org/wal.html

$db->exec('PRAGMA journal_mode = wal;');

?>

希望对你有所帮助。

bafade0b9e4fba720c9b2eb917ecfeb5.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值