PHP的p * connect方法如何工作?

时间:2009-08-26 03:56:25

标签: php networking

我的理解是PHP的p *连接是它在页面加载到服务之间保持连接(无论是内存缓存还是套接字等)。但这些连接是否安全?当两个页面同时尝试访问同一个连接时会发生什么?

4 个答案:

答案 0 :(得分:11)

在典型的unix部署中,PHP作为一个在apache Web服务器内运行的模块安装,而该服务器又被配置为将HTTP请求分派给多个生成的子级中的一个。

为了提高效率,apache通常会提前生成这些进程(预分配它们)并维护它们,以便它们可以分派多个请求,并节省为每个请求启动进程的开销进来了。

PHP的工作原理是在干净的环境中启动每个请求;页面加载之间没有脚本变量。 (与mod_perl或python形成对比,其中应用程序通常会因意外的状态宿醉而出现细微的错误。)

这意味着PHP脚本分配的典型资源,无论是GD的图像句柄还是数据库连接,都将在请求结束时发布。

某些资源(尤其是Oracle数据库连接)的建立成本非常高,因此需要以某种方式缓存已分派的Web请求之间的连接。

输入持久资源。

这些工作的方式是任何给定的apache子进程可以通过将其注册到资源的“持久列表”来维护超出请求范围的资源。持久列表在请求结束时不会被清除(在内部称为RSHUTDOWN)。当您使用pconnect函数时,它将查找给定一组唯一凭据的持久列表条目,并返回该条目(如果存在),或者使用这些凭据建立新连接。

如果您已配置apache以维护200个子进程,则应该会看到从Web服务器到数据库计算机建立的许多连接。

如果您有许多Web服务器和单个数据库计算机,您可能会比预期更多地加载数据库计算机。

使用线程化的SAPI,每个线程都维护持久性列表,因此它应该是线程安全的并且具有类似的好处,但是关于不推荐在线程SAPI中运行的PHP的常见警告适用 - 而PHP本身就是线程安全的,它使用的许多库可能存在自己的线程安全问题,并且会引起很多麻烦。

答案 1 :(得分:0)

一般来说,当PHP脚本请求持久连接时,PHP将在连接池中查找具有相同连接参数的连接。

如果发现一个未被使用,则会将其提供给脚本,并在脚本末尾返回到池中。

答案 2 :(得分:0)

手册的页面Persistent Database Connections可能会为您提供有关持久连接的一些信息。

它还没有说明线程安全的具体内容;就我记忆中的任何地方,我都没有见过任何关于它的东西,所以我认为它“只是工作正常”。我的猜测是连接只有在没有被其他线程同时使用的情况下重新使用,但它只是某种(逻辑)疯狂猜测......

答案 3 :(得分:0)

一般来说,PHP将在Web服务器上运行每个进程或线程一个持久连接。因此,进程或线程将不会访问另一个进程或线程的连接。

相反,当您建立数据库连接时,PHP将检查是否已经打开(在处理页面请求的进程或线程中),如果是,那么它将使用它,否则它将只是初始化新的。

因此,为了回答您的问题,它们不一定是线程安全的,但由于它们的运行方式,不存在两个线程或进程将访问同一连接的情况。