当前位置:首页 > 数据库 > SQlite

PHP的SQLite3Stmt类是否会导致锁定问题?

我正在使用PHP 5.3.3(CentOS 6.5中的最新版本)作为Prefork的Apache模块运行.

我发现,如果脚本以某种方式用完了时间或内存,SQLite3数据库将永远锁定,直到重新启动Apache.

可重现的测试:

// Open a connection to the database.
$db = new SQLite3('/path/to/test.db');

// Get a reserved lock.
$db->exec('BEGIN IMMEDIATE TRANSACTION');

// Construct a prepared statement SQLite3Stmt object.
$st = $db->prepare('SELECT value FROM sometable WHERE key=:key');

// Emulate the script running off the rails while calling the prepared statement.
while(true)
{
    $st->bindValue(':key', 1);
}

当然,如果运行此脚本,它将用完执行时间和/或内存.但是从那时起,数据库被原始的Apache进程锁定.在重新启动Apache之前,没有脚本可以对数据库进行另一个保留的锁定.

脚本终止后,PHP是否不应该关闭数据库连接?这是PHP中的错误吗?通过将其作为FastCGI进程运行是否可以解决?

解决方法:

在内部,SQLite在数据库文件上使用POSIX咨询锁.

进程退出时,操作系统将清除此锁.
但是,只要具有活动事务的Apache进程仍在运行,此锁就会保留.

如果您的脚本行为不正确,则应以某种方式运行它们,使它们中止会杀死整个过程.


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!