在PHP中检查现有的、持久的SQLite连接
PHP支持使用持久的SQLite连接。然而,在尝试运行维护脚本(如文件备份)并打开这样的连接时会出现问题。这些脚本可能会在流量较低的时段运行,而不需要不时重新启动服务器 问题是:如何检查当前是否存在SQLite持久连接,而不打开/调用一个连接(从而创建连接)在PHP中检查现有的、持久的SQLite连接,php,sqlite,persistence,Php,Sqlite,Persistence,PHP支持使用持久的SQLite连接。然而,在尝试运行维护脚本(如文件备份)并打开这样的连接时会出现问题。这些脚本可能会在流量较低的时段运行,而不需要不时重新启动服务器 问题是:如何检查当前是否存在SQLite持久连接,而不打开/调用一个连接(从而创建连接) 请参阅:如果您有权访问shell_exec()或者exec您可以运行一个shell命令来检查sqlite进程是否正在使用类似top的东西运行,或者可以使用类似lsof-i-n-P | grep-sqlite的命令来检查sqlite进程是否正
请参阅:如果您有权访问shell_exec()或者exec您可以运行一个shell命令来检查sqlite进程是否正在使用类似
top
的东西运行,或者可以使用类似lsof-i-n-P | grep-sqlite
的命令来检查sqlite进程是否正在运行,假设sqlite是进程的名称。如果使用PDO,您可以在运行维护脚本之前检查处理程序是否为null。这样,您就不会像使用
sqlite\u popen()
如果需要,可以创建与PDO的持久连接:$handler=newPDO('sqlite:test.db',NULL,NULL,array(PDO::ATTR_persistent=>TRUE))代码>
…然后,您可以在调用维护脚本之前关闭连接,前提是它符合某种计划:
if(!is_null($handler)){
$handler = null;
//run maintenance script, recreate connection once finished
}
最好是grep输入实际SQLite3数据库的名称,但是是的-lsof确实是判断(任何进程)是否已打开文件而不尝试打开它的唯一方法。问题是,如果调用处理程序,它将永远不会为null,因为它是一个持久连接,我相信如果尝试调用处理程序,连接将启动。但这可能不是真的,我们必须对此进行测试。请参阅:@David检查处理程序对象是否为null不会打开连接。我的意思是,如果需要,您可以创建一个与PDO的持久连接:newPDO('sqlite:test.db',NULL,NULL,array(PDO::ATTR_persistent=>TRUE))代码>…然后您可以在调用维护脚本之前关闭连接,前提是它符合某种计划。您是否会遇到这样的问题:有人打开了连接,然后维护脚本在其他人使用连接时关闭了连接?当您重新创建它时,它们将是连接的新ID,同时使用该连接的其他脚本将中断?通常不会太糟糕,但我认为一些维护脚本可能需要一段时间才能运行。@David在我看来,这只是保持连接打开的一个消极方面。这个问题可能可以通过延迟维护脚本的运行,直到所有用户都断开与数据库的连接来解决。我很喜欢这个讨论,谢谢Dave的意见。这就是主要问题:检查而不创建一个。或者,我正在考虑为脚本运行设置一个瞬时停止(2秒?)窗口。当没有活动连接时。但这可能是一个热门网站的问题。