用于Ajax-Request的PHP MySQLi Singleton结束了许多进程

时间:2011-07-01 08:39:56

标签: php ajax process singleton mysqli

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

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

所以,我想知道单身是否有可能是错误的(比如“为什么单身人士不好”)或者你能想象另一个错误来源?错误源,这么多MySQL进程启动并达到最大值。限制?

4 个答案:

答案 0 :(得分:1)

这与你的单身无关,你每隔.5秒向服务器发出一个请求,用户群可以获得请求的页面,然后你必须将它乘以拥有的用户数量。打开发出请求的页面。如果你真的需要以这个速度拉动服务器,你可能想要研究一些其他技术,如Comet

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

答案 1 :(得分:1)

我建议你发布你的singleton和ajax后端的代码。如果我们无法查看它,那么很难说出你的单例或ajax后端是错误的。

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

ajax后端如何看?它会立即运行查询吗?它是否会启动另一个php实例?配置的Web服务器和数据库有多少并发连接? 所有这些都将严重决定您的应用程序的行为方式。另外,如上所述。请注意,即使您使用单身,它也会 NOT 直接执行您的ajax调用。每次拨打电话时,您的php应用程序都会从​​头开始,您的单例将再次从头开始创建。

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

祝你好运!

答案 2 :(得分:1)

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

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

查看他们在做什么。我愿意打赌,这对你想要完成的事情是正确的。它会减少你的资源消耗。

答案 3 :(得分:-1)

我不确定我是否正确......

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

可能希望看看持久连接,但我不想使用它们;而且我不确定它们是否可以与MySQLi一起使用。