我可以检测客户端何时与 CGI 断开连接吗?

Joe*_* H. 4 httpd cgi apache-2.2

我有一个相当资源密集型的 CGI,需要很长时间才能开始发送数据。我们已经看到很多不耐烦的人重新加载几次的情况,然后触发要加载的 CGI 的额外运行,或者客户端超时并断开连接但 CGI 继续运行的情况。

有什么好的方法可以检测何时发生这种情况?它甚至不需要在 CGI 本身中(如果不是,可能会更好——它交给我无法控制的另一个程序),但可能是一个经常运行的 cron 作业寻找死的连接来收获。

我目前正在使用 Apache,但这是一个问题,如果它有处理它的规定(或让我监视问题的方法),我愿意运行其他一些网络服务器。

Kha*_*led 5

通常,在您开始写回给用户之前,您无法检测到断开的连接。否则,您的进程将继续执行其工作,而不会注意到用户端的连接中止。即使它谈论 PHP,这篇文章也是相关的。概念应该是一样的。

您可以尝试以下方法:

  1. 在后台完成耗时的工作。当用户请求 CGI 时,不要将任务作为正常的阻塞调用来执行。只需将任何内容返回给用户即可告知该请求正在处理中。当然,您需要找到某种方法来更新视图或提供另一个页面来使用某些请求 ID 或 IP 来检查作业状态。
  2. 尽快将数据发送回客户端,如果发送失败则退出(连接断开的指示)。例如,您可以每隔几秒或几分钟发送一次作业进度。

如果将当前运行的作业保存在数据库中,则可以保存请求 ID 和/或客户端 IP 地址。因此,您可以检测并忽略对同一资源的重复请求,告诉用户“您的请求正在处理中”。