gpt4 book ai didi

php - 在网络服务器中运行的后台服务如何通知客户端浏览器服务的进度?

转载 作者:行者123 更新时间:2023-11-28 01:01:25 25 4
gpt4 key购买 nike

首先,我对很多东西都是全新的,所以我欢迎任何意见,包括建议、现有项目、现有模型等。

我目前的问题是:

  1. 后台服务维护一个任务队列。后台服务用C++或python编写。

  2. 当客户端点击浏览器中的“创建任务”按钮时,信息将被发送到网络服务器,网络服务器脚本(用 PHP 编写)将发起对后台服务的 RPC 调用以将任务附加到内部队列。

  3. 客户端浏览器会发起AJAX请求等待任务完成。 AJAX 请求将保持到任务完成(或失败)或客户端取消请求。

因此,我需要一种低成本的方式来获取在后台服务进程上运行的任务进度。

我可以想到两种方法:

  1. 后台服务可以主动通知服务器 AJAX 脚本有关进度。这是低成本,但我实际上不知道该怎么做。有RPC框架提供这种异步回调吗?目前我决定使用的 RPC 框架是 Thrift,因为它支持多语言。

  2. 服务器端的 AJAX 脚本将每隔几秒进行一次 RPC 调用以获取当前进度,并在其间休眠。完成后AJAX脚本会返回,否则只会让客户端浏览器等待不返回。这实际上更简单,但我不确定它的成本。请注意,这里的延迟对我来说不是问题,因为我认为客户可以再等几秒钟。

有什么通用的方法/模型来处理这个问题吗?

感谢您的帮助。

最佳答案

取决于您如何编码。常见的方法是每 1-3 秒左右发出一个 javascripted ajax 请求,并从服务器轮询进度。

这将中间关闭连接并对服务器更加温和。如果您使用持久连接(WebSockets 也属于此类),您将使服务器保持忙碌。此外,“ sleep ”使 CPU 保持忙碌——如果我是你,我会尽量避免这种情况。另一方面,如果您有相应的资源...

我只能重复一遍:这取决于你如何编码它以及你最终对它的期望。

如果您希望客户端做更多的工作并温和地对待服务器,请选择第一个选项,如果您认为您的服务器可以处理它,请选择第二个选项并选择“持久”甚至使用 WebSockets(代表持久连接到您的服务器 - 请记住,它们也没有得到网络浏览客户端的广泛支持)。

虽然我认为最终 - 与让服务器 CPU 持续休眠和在此之上的一些持久连接占用服务器 CPU 相比,简单进步的权衡将使您选择第一个选项:轮询服务器脚本以获取客户端每 x 秒的进度值。顺便说一句:这就是 Twitter 所做的,他们的服务器一直存活到今天! ;)

关于php - 在网络服务器中运行的后台服务如何通知客户端浏览器服务的进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8476399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com