1

好的,这是我的情况:我正在寻找最好的设计方法。我在服务器端使用 PHP/Smarty,在客户端使用 HTML/jQuery,但这在这里并不重要。

我的服务器上有这个多用户系统。它是一种订购系统。一个标准用户——我们称他们为客户——可以从网上商店订购一些商品。网上商店包含来自多个卖家的商品。

当用户(客户)下订单时,卖家(也是系统中的用户)必须收到通知,告知有新订单并确认/拒绝。

当卖家确认/拒绝订单时,必须向用户发送通知,告知他/她的订单状态。

订单以及订单确认信息都存储在数据库中。

我现在能想到的唯一方法是不断地——在 AJAX 的短时间内——从卖家的屏幕上检查数据库中的新记录,并在客户等待时为他/她做同样的事情确认。

但我在想,有没有办法在用户(客户)下订单时触发向卖家发出通知,以便卖家只能在需要时加载数据库,而不是每隔一段时间加载数据库?

客户在等待确认时也是如此。但这并不是那么重要,因为它不会一直发生。如果卖家没有回应,订单将自动被拒绝,有一个等待限制。

我希望你能理解我的问题。

4

3 回答 3

1

此处关于将 Comet 与 PHP 结合使用的类似问题的答案表明,Apache 线程可能存在与客户端的所有打开连接绑定的问题。

根据这篇关于PHP Continuations的博客文章,可以在 PHP 中使用 continuation,但似乎没有关于该主题的那么多文档。然而,CometChat 在 PHP 中做到了。目前尚不清楚他们是否使用延续,但他们声称可以扩展到 100,000 个连接。更多关于 PHP Comet 的信息可以在这个类似的 Stack Overflow Question about A Solution for Comet and PHP中找到。

我还打算建议使用 Java,因为 Java 在实现可扩展的 Comet with Continuations 方面有着非常好的记录。 Conversion Support是一个在Jetty Web 服务器上使用 comet 和 continuation 的聊天软件示例。

由于您的代码使用 PHP,您可以使用 Querces 在 JVM 上运行您的 PHP 代码。此外,Querces PHP Benchmarks 建议它比 Apache 更快,这为您提供了更多优势。查看Querces 项目了解更多信息。

更新:我建议您自己进行基准测试或自己研究速度问题,因为可能有一些信息可能表明 Apache 更快。如果使用 Querces,重要的是要了解您实际上是在编写恰好看起来和感觉像 PHP 的 Java。因此,我建议在那里进行额外的研究,以便您了解这种方法的优点和缺点。

于 2011-02-05T22:35:49.280 回答
0

尽管即时更新会很好,但实际上,无论如何更新永远不会是即时的,通过互联网传输数据总会存在一定程度的延迟。

出于几个原因,轮询选项似乎更具吸引力。

您描述的系统听起来好像虽然开始时规模很小,但很容易扩展到多服务器配置。轮询将允许您创建 AJAX 请求可以查询的轮询服务器。这可以针对 AJAX 的小而快的特性进行优化,因为标准 Web 服务器可以专用于通常意义上的网页显示。

轮询思想也适用于 REST 风格的 API,使轮询区域完全独立于浏览器。您可能会发现,您系统上的卖家更愿意拥有本机应用程序,甚至是 iPhone/Android 应用程序。REST API 将允许您从任何可以发出 HTTP 请求的应用程序中执行此操作。

从本质上讲,您是在避免被锁定在特定技术上,这为未来开辟了可能性。它不会增加任何大量工作,并提供永久连接所不允许的灵活性级别。

于 2011-02-03T11:34:25.243 回答
0

上面提到的 COMET 和长轮询是解决这个问题的常见方法。但您也可以查看 HTML5 Web 套接字。所有浏览器都支持它,但 IE 浏览器有补丁/polyfills。

您还可以查看 Node.js 以与 apache 一起运行。

于 2011-02-03T11:42:18.237 回答