gpt4 book ai didi

php - 尝试从 PHP 脚本访问时数据库被锁定

转载 作者:IT王子 更新时间:2023-10-29 06:24:45 25 4
gpt4 key购买 nike

我正在编写一个与 PHP 后端通信的 Android 应用程序。后端数据库是 SQLite 3。问题是,我间歇性地收到此错误 PHP Warning: SQLite3::prepare(): Unable to prepare statement: 5, database is locked。我在每个 PHP 文件中打开一个到数据库的连接,并在脚本完成时关闭它。我认为问题是一个脚本在写入数据库文件时锁定了数据库文件,而第二个脚本试图访问它,但失败了。避免这种情况的一种方法是在所有 php 脚本之间共享一个连接。我想知道是否有任何其他方法可以避免这种情况?

编辑:这是第一个文件:

<?php
$first = SQLite3::escapeString($_GET['first']);
$last = SQLite3::escapeString($_GET['last']);
$user = SQLite3::escapeString($_GET['user']);
$db = new SQLite3("database.db");
$insert = $db->prepare('INSERT INTO users VALUES(NULL,:user,:first,:last, 0 ,datetime())');
$insert->bindParam(':user', $user, SQLITE3_TEXT);
$insert->bindParam(':first', $first, SQLITE3_TEXT);
$insert->bindParam(':last', $last, SQLITE3_TEXT);
$insert->execute();
?>

这是第二个文件:

<?php
$user = SQLite3::escapeString($_GET['user']);
$db = new SQLite3("database.db");
$checkquery = $db->prepare('SELECT allowed FROM users WHERE username=:user');
$checkquery->bindParam(':user', $user, SQLITE3_TEXT);
$results = $checkquery->execute();
$row = $results->fetchArray(SQLITE3_ASSOC);
print(json_encode($row['allowed']));
?>

最佳答案

首先,当您用完某个资源后,您应该始终将其关闭。理论上它会在垃圾收集时关闭,但您不能指望 PHP 立即执行此操作。我已经看到一些数据库(以及与此相关的其他类型的库)因为我没有明确释放资源而被锁定。

$db->close();
unset($db);

其次,Sqlite3 给你一个忙超时。我不确定默认值是多少,但是如果您愿意在执行查询时等待几秒钟以清除锁定,则可以这样说。超时以毫秒为单位。

$db->busyTimeout(5000);

关于php - 尝试从 PHP 脚本访问时数据库被锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9866139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com