我应该$mysqli->;如果PHP通过FCGI运行,则在每次页面加载后关闭连接


Should I $mysqli->close a connection after each page load, if PHP runs via FCGI?

我通过FCGI运行PHP——也就是说,我的web服务器产生了几个PHP进程,它们一直运行大约10000个请求,直到它们被回收。

我的问题是,如果我的PHP脚本顶部有一个$mysqli->connect,那么当我即将结束运行脚本时,是否需要调用$mysqli->close

由于PHP进程开放时间很长,我认为每个$mysqli->connect都会泄漏1个连接,因为进程一直在运行,没有人关闭连接。

我的想法对不对?我应该打$mysqli->close吗?

当PHP退出时,它会优雅地关闭数据库连接。

使用close方法的唯一原因是,当你想终止一个不再使用的数据库连接时,你有很多事情要做:比如处理和流式传输数据,但如果这很快,你可以忘记close语句。

把它放在脚本的末尾意味着冗余,没有性能或内存增益。

更详细地说,特别是关于FastCGI:

FastCGI保持PHP处理在请求之间运行。FastCGI善于利用服务器的可用RAM将PHP脚本保存在内存中,而不必为每个PHP请求启动单独的PHP进程,从而减少CPU使用量。

FastCGI将启动一个主进程,以及您定义的该主进程的多个分支,是的,这些分支进程可能会使用很长时间。这实际上意味着进程不必在每次需要执行脚本时启动整个PHP进程。但这并不是说你认为你的脚本现在一直在运行。每次必须执行脚本时,仍有一个启动和关闭阶段。此时会填充全局变量(例如$_POST$_GET)等。每次进程关闭时,您都可以通过register_shutdown_function()执行函数。

如果您没有使用持久数据库连接,也没有关闭数据库连接,那么不会发生任何错误。正如Colin Schoen所解释的,PHP最终会在关闭期间关闭它们。

尽管如此,我强烈建议您关闭连接,因为一个精心编制的程序知道对象的生命周期何时结束,并会自行清理。它可能会给你及时交付所需的毫微秒或纳秒。

只需始终创建自包含的对象,这些对象在完成所做的任何操作后也会进行清理。

我从来没有相信FCGI会帮我关闭数据库连接。多年前,我在一本初学者书中学会了一个习惯,那就是总是显式关闭我的数据库连接。

输入十六次按键不值得可能的内存和连接泄漏吗?就我而言,它的保险很便宜。

如果您有长期运行的FastCGI进程,例如通过php-fpm,您可以通过在每个进程中重用数据库连接并避免打开一个进程的成本来获得性能。

由于您很可能在代码中的某个时刻打开连接,因此您应该了解如何让mysqli打开持久连接,并在由同一进程管理的后续请求中将其返回给您。

http://php.net/manual/en/mysqli.quickstart.connections.php

http://php.net/manual/en/mysqli.persistconns.php

在这种情况下,你不想关闭连接,否则你就破坏了保持连接打开的目的。此外,请注意,每个PHP进程都将使用一个单独的连接,因此您的数据库应该允许同时打开至少该数量的连接。

你的思维方式是正确的。关闭连接以防止内存/数据泄漏和损坏仍然很重要。

您还可以降低每个循环回收的scipts的数量,以停止连接关闭。

例如:每运行2500个脚本,停止并关闭连接,然后重新打开连接。

还建议:经常备份数据。

希望我能帮上忙。幻影