2010-12-08 116 views
2

我有一个基本的HTML文件,使用jQuery的ajax,每2秒连接到我的polling.php脚本。PHP + AJAX与MySQL - 查询每2秒,在TIME_WAIT太多

polling.php只是连接到mysql,检查ID是否比我隐藏的当前ID更新,如果有新内容,则返回echo。由于JavaScript每2秒连接一次,因此我在TIME_WAIT中获得了数千个连接,仅用于我的客户端。这是因为我的脚本一遍又一遍地重新连接到MySQL。我试过mysql_pconnect但它没有任何帮助。

有什么办法可以让PHP打开1个连接,并继续使用它进行查询?而不是重新连接每一个时间并完成所有这些TIME_WAIT连接。不确定在这里做什么才能正常工作。

回答

1

我真的结束了基本的长轮询。我做了一个简单的PHP脚本来无限循环,并且每2秒查询一次。如果它发现新的东西,它会回应出来,并打破循环。我的jQuery只是ajax连接到它,并等待响应;在响应时,它会更新我的页面,并重新启动轮询。很简单!

PS,长轮询方法还减少了浏览器内存问题,并大大减少了服务器上的TIME_WAIT连接。

0

有没有这样做的微不足道的方法,因为pconnect不适用于多个网页调用。但是,一些最小化数据库吞吐量的方法是:

  1. 降低轮询时间。 (2秒是或许有点过度?)

  2. 有运行每“n”个秒“主” PHP脚本,从数据库中提取的数据,并以适当的格式将其保存(序列PHP数组,XML, HTML数据等)在文件系统中。 (我建议写入临时文件,然后重命名现有文件以最小化任何部分文件收集问题。)Ajax请求的PHP页面将仅使用此数据文件中的信息。

在执行主PHP脚本,您既可以使用cron或者干脆让当文件的内容被认为过于陈旧谁第一次请求页面的用户而言。 (您可以通过filemtime函数将数据文件的时间戳用于此目的。)我个人会使用后一种方法,因为cron为此目的过于矫枉过正。

如果需要,您可以更进一步,使用memcached而不是平面文件等。 (也就是说,这可能是在这个阶段的事情过于复杂的解决方案。)

+0

“(序列化PHP数组,XML,HTML数据等)”。 memcached是否容易在这里使用? – Keyo 2010-12-08 23:20:05

+0

@Keyo很大程度上取决于他的PHP安装是否提供memcached。 :-)因此,我首先提到了基本的文件系统方法。 – 2010-12-08 23:21:43