持久数据库连接
持久连接是指当脚本的执行结束。当永久连接请求时,PHP检查是否已经存在相同的持久性连接(从早期开始一直保持打开状态)-如果存在使用它。如果它不存在,则创建链接。“相同”connection是打开到同一主机的连接相同的用户名和密码(如果适用)。
不完全熟悉web服务器工作方式的人并且分配负载可能会将持久连接错误地理解为他们不是。尤其是,他们做到了不给如果您能够在同一链接上打开“用户会话”做不让你有能力建立交易效率高,而且他们不会做很多其他事情东西。事实上,要非常清楚这个主题,持久的连接不会给你任何非持久性无法实现的功能兄弟。
为什么?
这与网络服务器的工作方式有关其中您的web服务器可以利用PHP生成网页。
第一种方法是使用PHP作为CGI“包装器”。当运行此方法是创建并销毁PHP解释器的实例对于web服务器的每个页面请求(对于PHP页面)。因为它在每次请求后都会被销毁获取(例如到SQL数据库服务器的链接)在以下情况下关闭它被摧毁了。在这种情况下,你不会从尝试中获得任何好处使用持久连接——它们根本不持久。
第二种也是最流行的方法是将PHP作为模块运行在多进程web服务器,目前仅包括Apache。A类多进程服务器通常有一个进程(父进程)协调一组实际执行提供网页的工作。当请求来自客户,它被交给一个还没有交的孩子为另一个客户服务。这意味着当同一客户对服务器的第二个请求,可以由另一个子进程比第一次。打开持久连接时,下面每个请求SQL服务的页面都可以重用相同的已建立与SQL server的连接。
最后一种方法是使用PHP作为多线程web的插件服务器。目前PHP支持WSAPI和NSAPI(onWindows),所有这些都允许将PHP用作多线程上的插件Netscape FastTrack(iPlanet)、Microsoft Internet Information等服务器服务器(IIS)和O'Reilly的网站专业版。行为本质上是与前面描述的多进程模型相同。
如果持久连接没有任何添加的功能它们有好处吗?
这里的答案非常简单——效率。持久如果创建到SQL的链接的开销很大,那么连接就很好服务器高。这项开销是否真的很高取决于在许多因素上。比如,它是什么样的数据库,是否它位于您的web服务器所在的同一台计算机上加载了SQL服务器所在的机器等等。这个底线是,如果该连接开销很高,那么将持续存在联系对你有很大帮助。它们导致子进程只需在其整个生命周期内连接一次,而不是每次它处理需要连接到SQL的页面的时间服务器。这意味着,对于每个打开持久性连接将具有自己的到服务器。例如,如果您有20个不同的子进程运行与SQL server建立持久连接的脚本,您将有20个不同的SQL server连接,其中一个来自每个孩子。
但是请注意,如果您使用数据库的连接限制超过了持久性子连接。如果数据库的并发限制为16连接,在繁忙的服务器会话过程中,17个子节点线程尝试连接,则无法连接。如果存在脚本中不允许关闭连接的错误关闭(例如无限循环),数据库只有16个连接可能会很快被淹没。检查数据库文档以了解有关处理废弃或空闲连接的信息。
警告
在以下情况下,需要记住几个额外的注意事项使用持久连接。一是使用表格时锁定持久连接,如果脚本用于reason无法释放锁,然后使用相同的连接将无限期阻塞,并且可能需要重新启动httpd服务器或数据库服务器。另一个是当使用事务时,事务块还将转到使用该连接的下一个脚本if脚本执行在事务块结束之前结束。无论哪种情况,您都可以使用寄存器关闭函数()注册简单的清理功能可以解锁表或回滚交易。更好的是,通过不使用使用表锁或事务(您仍然可以在其他地方使用它们)。
重要的总结。持久连接设计为具有到常规连接的一对一映射。这意味着你应该总是能够替换持久性具有非持久连接的连接,并且不会更改脚本的行为方式。它可以(和可能会)更改脚本的效率,但不会行为!
另请参见ibase_pconnect(),ociplogon(),odbc_pconnect(),oci_pconnect(),pfsockopen()、和pg_pconnect().