我正在用PHP中的以下语句打开一个SQLiteDB,效果很好。
$db2 = new SQLite3("/home/pi/ion.sqb", SQLITE3_OPEN_READONLY);
$resu2 = $db2->query("select * from test where name = 'Hans'");
但是我不时遇到以下错误消息:: SQLite被锁定,PHP脚本使用以下致命消息杀死自己:
PHP Warning: SQLite3::query(): Unable to execute statement: database is locked in /home/pi/ion.sqb on line 559
PHP Fatal error: Uncaught Error: Call to a member function fetchArray() on boolean in /home/pi/dbc.php:560
Stack trace:
#0 {main}
thrown in /home/pi/dbc.php on line 560
我试图检查数据库是否被锁定,并跳过选择...但是没有成功:
$db2 = new SQLite3("/home/pi/ion.sqb", SQLITE3_OPEN_READONLY);
$resu2 = $db2->query("select * from test where name = 'Hans'");
if (!$db2) {
echo "DB DB-locked";
}
else{
$resu2 = $db2->query("select * from test where name = 'Hans'");
while ($dsatz2 = $resu2->fetchArray(SQLITE3_ASSOC))
...
可以运行到已记录的SQLite DB中的问题是已知的.. 当其他任何句柄处于写入模式时,也可以进行选择。
我怎么可能我的脚本遇到了致命错误并结束了自身?
PHP Fatal error: Uncaught Error: Call to a member function fetchArray() on boolean in /home/pi/dbc.php:560
Stack trace:
#0 {main}
thrown in /home/pi/dbc.php on line 560
答案 0 :(得分:1)
这是一个偶然性问题。 sqlite规范明确指出,在多进程环境(如果多个请求同时命中文件,则为PHP)或多线程环境中,如果两个SELECT
查询并发命中同一表,则“稍后“一个人会收到此错误。
不幸的是,用PHP处理此问题时,您没有很多选择。我什至不认为您可以在请求结束时结束的环境中启用共享缓存,因此即使在窗口之外也是如此。
老实说,我建议您进行一次微睡眠(例如,是您平常SELECT
持续时间的一半),然后在这种情况下重试。