我正在使用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)!