PHP中后端服务的共享/池化连接

时间:2009-09-05 06:59:26

标签: php performance web-services caching connection-pooling

当我让PHP与各种后端服务(例如Amazon S3或任何其他随机Web服务 - 我想要一般解决方案)交谈时,我正试图找出最小化资源利用率的最佳方法。理想情况下,我希望通过一些缓存与后端(或者可能是一小段持久连接)建立一个持久连接,然后让所有PHP任务共享它。对于这个问题,我们可以认为它只是只读的。对我来说,如何在PHP中执行此操作并不明显。有一些特定于数据库的东西,比如mysql_pconnect(),但这对我来说并不是真的。

我已经拥有的一个想法似乎有点不理想(但仍然比让每个请求创建和销毁新连接更好)是使用本地缓存代理(在单独的进程中),这将有效地执行汇集和缓存。 PHP仍然会为每个请求打开和关闭一个连接,但至少它会是一个本地进程,所以它应该更快一些(并且它会减少后端的负载)。但似乎并不需要这种疯狂。必须有一个更好的方法。这在其他语言中很容易。请告诉我我错过了什么!

2 个答案:

答案 0 :(得分:1)

各种网络技术之间存在着巨大的意识形态脱节。有些基本上是守护进程,它们在后台运行全职,并处理自己传入的请求。由于流程始终在运行,因此您可以拥有已打开的现有工作连接池。

PHP(和普通的CGI脚本)在幕后没有守护进程。每次请求进入时,PHP 解释器都会以干净的平板启动,编译脚本并运行字节码。没有持久性。支持持久连接的PHP数据库函数在 Web服务器子级别(即附加到Apache进程的mod_php)建立连接。这不是一个连接池,因为您只能看到连接到您自己的进程的持久连接。

如果没有守护程序或类似的过程在幕后分发资源,您将无法获得真正的连接池。

请记住 大多数服务的大多数新连接并不重,而且重量级的非数据库连接可能对此概念不友好连接池。

在考虑编写自己的基于PHP的守护进程来处理这样的事情之前,请记住它可能已经解决了问题。 Python提出了一些名为 WSGI 的东西,在Ruby中有类似的实现,名为 Rack 。 Perl也有一些非常相似的东西,但我记不起它的名字了。快速浏览一下Google并未显示任何WSGI的PHP实现,但这并不意味着它们不存在......

答案 1 :(得分:0)

由于S3和其他Web服务使用HTTP作为传输,因此缓存连接不会带来显着的好处。

  • 虽然您可能正在使用似乎作为第一步进行身份验证的API,但查看S3 Documentation,每次请求都会进行身份验证 - 因此在验证一次并重新使用连接时没有任何好处
  • 通过HTTP的Web服务请求是轻量级的,通常是无状态的。一旦您的请求得到解答,服务器上就不会消耗任何资源(连接或sesson状态)。这允许Web服务实现者使用许多计算机来响应您的请求,而不会占用特定服务器上的资源