在PHP中检查现有的、持久的SQLite连接

3
PHP支持使用SQLite持久连接。然而,在打开这样的连接后,尝试运行维护脚本(如文件备份)时会出现问题。这些脚本可能在低流量时期经常在没有服务器重启的情况下运行。
如何检查是否有当前的SQLite持久连接,而不打开/调用一个(从而创建连接)?
请参阅:php SQLite 持久连接

链接已损坏(404)。 - Peter Mortensen
3个回答

2

如果您使用PDO,可以在运行维护脚本之前检查处理程序是否为空。这样,您就不会像使用sqlite_popen()一样创建连接。

如果需要,可以使用PDO创建持久连接:$handler = new PDO('sqlite:test.db', NULL, NULL, array(PDO::ATTR_PERSISTENT => TRUE));

然后,在调用维护脚本之前,只需关闭连接即可,假设它是按照某种时间表进行的:

if(!is_null($handler)){
$handler = null;
//run maintenance script, recreate connection once finished
}

问题在于,如果您调用处理程序,它永远不会为空,因为它是一个持久连接,并且我相信如果您尝试调用处理程序,连接将启动。虽然可能并非如此,但必须进行测试。请参见:https://dev59.com/6EjSa4cB1Zd3GeqPBwSv - David Weitz
@David 检查处理程序对象是否为空不会打开连接。我的意思是,如果您想要创建一个持久连接,可以使用PDO:new PDO('sqlite:test.db', NULL, NULL, array(PDO::ATTR_PERSISTENT => TRUE));...然后,在维护脚本被调用之前,您可以关闭连接,假设它是按照某种时间表进行的。 - Trevor Arjeski
你是否会遇到这样的问题:有人打开了一个连接,然后维护脚本运行并关闭了该连接,而此时其他人正在使用它?当你重新创建连接时,它将具有新的ID,而在此期间使用该连接的其他脚本将会中断。通常情况下这不是太糟糕,但我认为一些维护脚本可能需要一段时间才能运行完毕。 - David Weitz
@David 看起来这只是保持连接开放的负面影响之一。这个问题可能可以通过延迟维护脚本的运行直到所有用户从数据库断开连接来解决。我喜欢这个讨论,感谢 Dave 的意见。 - Trevor Arjeski
这是主要问题:在不创建连接的情况下进行检查。或者,我正在考虑为脚本运行设置暂停时间(2秒钟?),以便在没有活动连接时运行。但这可能会成为流行网站的问题。 - PicoCreator
@pico.creator 就像我说的那样,你可以使用PDO在不创建的情况下进行检查。 - Trevor Arjeski

1
如果您可以访问shell_exec()或exec,您可以运行一个shell命令来检查SQLite进程是否正在运行,例如使用类似于top的命令或者像lsof -i -n -P | grep sqlite这样的命令,假设sqlite是该进程的名称。

最好使用grep命令查找实际的SQLite3数据库名称,但是lsof确实是唯一的方法来判断是否有任何进程打开了该文件而不尝试打开它。 - Tim Post

0

引用https://www.php.net/manual/en/features.persistent-connections.php上的手册:

“当请求持久连接时,PHP会检查是否已经存在相同的持久连接(从先前保持打开状态) - 如果存在,则使用它。如果不存在,则创建链接。'相同'的连接是指使用相同的用户名和密码(适用于的情况下),连接到同一主机的连接。”

这似乎意味着在尝试连接之前无需进行先前检查。

请注意,该文章涉及许多有关持久连接与Web服务器协作的考虑因素,特别是关于随后尝试使用连接的进程可能会受到早期错误的故障所阻止的内容,这意味着在Web服务器环境中,由于Web会话可以随时终止,持久连接可能不可靠。

特别是,它建议不要将持久连接用于使用表锁或事务的脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接