【问题标题】:PHP+AJAX with MySQL - Query every 2 seconds, too many in TIME_WAITPHP+AJAX 与 MySQL - 每 2 秒查询一次,在 TIME_WAIT 中查询太多
【发布时间】:2010-12-08 22:42:05
【问题描述】:

我有一个基本的 HTML 文件,使用 jQuery 的 ajax,每 2 秒连接到我的 polling.php 脚本。

polling.php 只是连接到 mysql,检查 ID 是否比我隐藏的、存储的当前 ID 更新,然后回显是否有任何新内容。由于 javascript 每 2 秒连接一次,因此我在 TIME_WAIT 中获得了数千个连接,仅针对我的客户。这是因为我的脚本一遍又一遍地重新连接到 MySQL。我试过 mysql_pconnect 但没有任何帮助。

有什么方法可以让 PHP 打开 1 个连接,并继续使用它进行查询?而不是每次都重新连接并进行所有这些 TIME_WAIT 连接。不确定在此处做什么才能使其正常工作。

【问题讨论】:

    标签: php jquery mysql ajax


    【解决方案1】:

    我实际上最终做了基本的长轮询。我制作了一个简单的 PHP 脚本来无限循环,它每 2 秒查询一次。如果它发现了一些新的东西,它会回显它,并打破循环。我的 jquery 只是 ajax 连接到它,并等待响应;作为回应,它会更新我的页面,并重新启动轮询。很简单!

    PS,Long Polling 方法还可以减少浏览器内存问题,并大幅减少服务器上的 TIME_WAIT 连接数。

    【讨论】:

    • 这获得了大量的浏览量,所以我想我会添加更多。您在 PHP 中创建了一个 while 循环,并在 15-30 秒后使其中断。由于超时原因,我建议保持在 30 秒以下。在 while 循环中,您可以每秒查询一个数据库,或者 memcached,或者可以通过 filemtime() 轮询一个简单的文本文件以查看它是否已更改。当发生新的事情来更新它的时间时,您可以在文件上使用 touch()。如果有新内容,请回显“NEW”并退出脚本。如果什么都没有,则在循环后回显“NONE”或其他内容并退出。然后在你的 Javascript 中,检查“NEW”和“NONE”。
    【解决方案2】:

    没有简单的方法可以做到这一点,因为 pconnect 不能跨多个网页调用工作。然而,一些最小化数据库吞吐量的方法是:

    1. 缩短轮询时间。 (2秒可能有点过分?)

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

    就执行主 PHP 脚本而言,您可以使用 cron 或在文件内容被认为太陈旧时让第一个请求页面的用户简单地执行。 (您可以通过filemtime 函数为此目的使用数据文件的时间戳。)我个人会使用后一种方法,因为为此目的,cron 是多余的。

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

    【讨论】:

    • “(序列化的 PHP 数组、XML、HTML 数据等)”。 memcached 在这里用起来还不够简单吗?
    • @Keyo 很大程度上取决于他的 PHP 安装中是否有 memcached。 :-) 因此,我首先提到了基本的文件系统方法。
    • Memcached 不仅解决了这个问题。理想的解决方案是彗星服务器,但我还没有弄清楚如何让彗星服务器为我查询我的数据库。现在,我想我会将间隔提高到 5 秒,尽管这会杀死任何接近实时的东西。
    • @Ryan - 我建议也使用主 PHP 主脚本方法 - 这将从根本上将轮询查询的数量降低到每 n 秒两到三个。
    • 感谢您的所有回复。我实际上最终做了基本的长轮询。我制作了一个简单的 PHP 脚本来无限循环,它每 2 秒查询一次。如果它发现了一些新的东西,它会回显它,并打破循环。我的 jquery 只是 ajax 连接到它,并等待响应;作为回应,它会更新我的页面,并重新启动轮询。很简单!
    猜你喜欢
    • 2019-08-13
    • 2014-08-18
    • 2013-05-13
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多