【问题标题】:comet style application with loops带有循环的彗星风格应用程序
【发布时间】:2011-05-29 09:21:55
【问题描述】:

是否所有彗星风格的应用程序都需要在服务器端的应用程序某处使用循环来检测更新/更改?如果不是,请您解释一下无环彗星式应用程序背后的逻辑是如何工作的?

【问题讨论】:

    标签: php javascript asp.net jquery sql


    【解决方案1】:

    这种应用程序总是需要一个循环,你需要定期检查新数据等。当然你可以使用基于偶数循环的方法使“循环”非阻塞,但最终还是有某处的循环。

    想一想,如果没有循环,您将如何使其工作?我确实无法想象一种不使用循环的方式somewhere

    【讨论】:

    • 所以基本上,google wave,有关键字级协作系统,其中循环检查其数据库中的每个按键差异???
    • 我不明白您所说的“在他们的数据库中循环”是什么意思。当然,如果您想要进行实时协作,您需要检查用户发送的每个按键,然后将它们发送给其他用户,虽然它们可能会进行一些缓存以减少数据库写入的数量,但是您仍然需要检查彗星连接是否有新的传入数据,这将需要一个循环(无论是否阻塞)。
    • 是否不可能让服务器等待按键,一旦它收到来自 user1 的按键,它就会将该按键发送给 user2,2,3,4,n 然后保存数据库中的按键?
    • 而不是循环检查数据库中的差异?
    • 那么您将如何等待按键? Something 需要检查套接字(或数据来自何处)是否有新数据。如果您等待阻塞 IO,则基本上您循环并检查每次迭代是否有可用的新数据。基于事件的方法可能会隐藏应用程序的循环,但它仍然存在,在“服务器”范围之外的其他线程中。
    【解决方案2】:

    简短的回答是,不,并非所有都需要服务器端的循环。

    相反,您可以使用来自浏览器的长轮询 AJAX 调用来请求数据,

    服务器只是简单地用数据进行响应,浏览器会等到收到响应后再发送新的请求。

    【讨论】:

    • 但是服务器如何等待?通过循环?
    • 它不会等待。它只会不断响应。
    • 但是如果10分钟没有变化怎么办,它怎么知道什么时候发生了变化呢?
    • 这就是 AJAX 的美妙之处,响应告诉浏览器它已经到达。
    【解决方案3】:

    解决方案可能是 stream_set_blocking。使用任何可能的阻塞资源被操作系统挂起并等待适当的中断。

    客户端:

    1. 对端点脚本的 Ajax 调用(ajax 超时,例如 30 秒 - 30 秒后启动另一个 - 30 秒后您将收到来自服务器的响应 - 已达到脚本执行时间)
    2. 如果您将在 30 秒内获得响应,则处理响应(异步)并打开新连接(就像在 comet done 中一样 - 我在 cometD 客户端中看到了)

    服务器设置:

    1. 设置 apache 超时(在请求和数据发送到 30-31 秒之间),这样 apache 将允许您等待这么久
    2. 将 apache 设置为允许大量子实例(并发用户 * 1.5),但您需要确保您有足够的内存用于此数量的 apache 实例(+ php 子实例使用的内存)

    脚本一:

    1. execution_time = 28
    2. 设置shutdown_function 以发送响应(超时,但如果需要,它的格式和ajax 可以理解)
    3. 你需要打开文件,清空一个
    4. 使用 stream_set_blocking 为文件流启用阻塞模式
    5. 尝试从文件读取,您将被挂起,直到其他进程写入文件或达到超时。
    6. 一旦脚本从其他进程写入文件中的内容,它就会返回并发送响应。 (这将触发另一个 ajax 调用和另一个休眠进程)

    最糟糕的是,您需要考虑如何让多个阅读器脚本从同一总线(文件)读取而不会相互干扰。 也可能会在将消息写入总线的时候发生超时。

    (希望这个解决方案没有我的英文那么差)

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2012-07-08
      • 1970-01-01
      • 2015-07-15
      • 2013-01-14
      相关资源
      最近更新 更多