我正在使用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进程仍在运行,此锁就会保留.
如果您的脚本行为不正确,则应以某种方式运行它们,使它们中止会杀死整个过程.
标签:sqlite,php 来源: https://codeday.me/bug/20191121/2051594.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。