所以假设我像往常一样用我的php脚本连接到mysql,但是假设我从来没有实际调用任何会关闭该连接的代码,只是让它直到页面被提供给用户
我有什么理由不这样做吗?如果我这样做会产生什么负面影响(如果有的话)?
答案 0 :(得分:1)
签出php选项
; http://php.net/mysql.allow-persistent
mysql.allow_persistent = On
如果你能设置它,这应该会有所帮助。
答案 1 :(得分:1)
根据你使用而不是的mysql扩展,关闭连接实际上是有益的,因为这将允许使用持久连接。这意味着连接仅在脚本第一次运行时打开,并且每次后续运行都使用已打开的mysql连接,并根据需要重新连接。这比在每个请求上打开和关闭连接更快,资源更少。如果您使用的是mysqli
,则应该可以建立持久连接,并且更可取。
即使你的mysql扩展不支持持久连接,或者没有配置为使用它们,这只意味着当脚本退出时连接将关闭,这与自己关闭它没有什么不同,这意味着手动关闭它什么都没有。
结论:自己关闭连接可能不会让你失望,实际上可能会损害性能。
编辑:请参阅mysql.allow_persistent
和mysqli.allow_persistent
以配置是否将永久连接用于mysql,具体取决于您使用的是哪个mysql扩展。
答案 2 :(得分:1)
与任何未经优化的代码一样,无法关闭()或kill()套接字通常不会变得明显,直到网站/应用程序需求很大,即大量页面请求被发送到服务器。通过在请求被服务之后不杀死+关闭并释放套接字,套接字处于“等待”状态一小段时间,增加了新页面加载和连接尝试时发生的任何新套接字连接的负载制作完成。在非常高的流量条件下,这些套接字将继续在进程内存中累积,可能(基于您的最大连接数和max_user_connections参数)导致无处不在的“Max connections reach ....”消息。
脚本完成后发生的垃圾收集不一定会回收套接字端点。据我所知,只有在mysqli_close()之后调用mysqli_kill()才能实际杀死套接字。
对于持久连接,您没有提到您正在使用的mysql api或服务器以及如何将php加载到服务器和网络拓扑中。持久连接允许您避免打开与mysql的连接的开销。如果mysql与Web服务器在同一个盒子上运行,那么持久连接可能不会带来太大的可伸缩性。如果php在cgi进程中运行,则持久连接将无法工作,因为php进程仅在请求的生命周期内存在。不要将持久连接与JDBC连接池混淆,它们是不一样的。
答案 3 :(得分:0)
由于PHP具有垃圾收集功能,因此当脚本在服务器上完成时,连接将关闭。除非您将其指定为持久连接。
来自php参考:
通常不需要使用mysql_close(),因为非持久性打开链接会在脚本执行结束时自动关闭。
您可以在mysql_close参考here上阅读更多内容。