PHP MySQLi Singleton for Ajax请求以许多进程结束


PHP MySQLi Singleton for Ajax-Requests end in to many processes

我有一个PHP应用程序,它使用AJAX来获取信息——在后面,它使用PHP MySQLi单例。AJAX请求每0.5秒发送一次,他们从数据库中读取一些内容,并将其作为JSON字符串发送回网站。当我多次打开网站(在不同的选项卡中)时,我会收到一个错误,因为PHP,或者更确切地说是apache,无法"派生另一个进程"。我的服务器有足够的RAM,但问题是达到了130个进程的进程限制。

cat /proc/user_beancounters
---------------------------
        | held  | maxheld |
numproc |  130  |     130 |

所以,我想知道单例是否有可能是错误的(比如"为什么单例是坏的"),或者你能想象另一个错误源吗?错误源,那么多MySQL进程启动并达到最大限制?

我建议您发布singleton和ajax后端的代码。如果我们看不到,就很难说您的singleton或ajax后端有问题。

不过,我可能会将连接数量视为更可能的原因。如果这不是本地应用程序,那么实际请求耗时超过0.5秒的情况并不少见。因此,在调用另一个请求之前,一个请求可能不会完成。随着时间的推移,这可能会建立一个队列,而SQLi后端无法足够快地处理该队列,并且由于每个连接的客户端每0.5秒向队列中添加一个新请求,因此进程计数将开始上升。

ajax后端看起来怎么样?它会直接运行查询吗?它是否启动另一个php实例?Web服务器和数据库配置了多少个并发连接?所有这些都将在很大程度上决定应用程序的行为。此外,如前所述。请注意,即使您使用单例,它也不会在ajax调用执行之后存活。每次调用时,php应用程序都会从头开始,并且您的单例会再次从头开始创建。

您可以设置一个应用程序(用PHP或其他语言编写),它实际上会一直运行,并使用主循环。然后,您可以让它侦听特定的套接字,或者通过其他方式让ajax后端将数据传递给该应用程序。然后,运行中的应用程序可以处理数据库后端,并将数据返回到ajax后端,后者将返回回复。这样,数据库处理程序就不会一直重新创建您的单例。但是,如果有很多客户端请求每0.5秒查找一次数据库,那么您很可能仍然会遇到队列问题

祝你好运!

这与您的单例无关,即您每0.5秒向服务器发出一次请求。发出请求的页面对用户群可用,然后您还必须将其乘以打开发出请求的页的用户数量。如果你真的需要以这种速度拉服务器,你可能想研究一些其他技术,比如Comet。

当然,如果处理请求需要很长时间,您可以优化这些请求,并可能减少处理请求所需的分叉数量,但这仍然是一个持续的问题。

首先想到的(正如其他人所提到的)是ping服务器的频率。你为什么需要这么高?这只会产生更多的过程(像其他人建议的那样重叠),浪费处理周期。

一种更好的方法叫做长轮询。这是一个客户端浏览器发送请求,但不希望立即返回响应的过程。相反,服务器会挂起该请求,直到它有东西要发送回客户端。这要高效得多,而且实际上是APE项目所使用的(Ajax Push Engine-http://www.ape-project.org/)。

看看他们在做什么。我敢打赌,这将是正确的,为你的努力实现。这将减少你的资源消耗。

我不确定我做对了。。。

当AJAX请求被处理时,一个新的PHP进程被运行;singleton仅在此进程中可用,singleton不在几个PHP进程之间共享。因此,每个请求最终都有自己的数据库连接,singleton只是确保每个进程不超过一个连接。

可能想要查看持久连接,尽管我不喜欢使用它们;我不确定它们是否可以与MySQLi一起使用。