我有一个相当耗费资源的CGI,需要相当长的时间才能开始发送数据。 我们已经看到了很多不耐烦的人重新加载了几次,然后触发额外运行的CGI被加载,或者客户端超时并且断开连接的情况,但是CGI继续运行。
有什么好的方法来检测这种情况何时发生? 它甚至不需要在CGI本身之内(如果不是,它可能更好 – 它交给另一个我无法控制的程序),但可能是一个经常运行的cron作业寻找死亡的连接收获。
我目前正在使用Apache,但这是一个问题,如果它有处理它的条款(或者让我监视这个问题的方法),我愿意运行其他的web服务器。
通常情况下,直到开始写回给用户时,才能检测到连接断开。 否则,您的过程将继续执行其工作,而不会从用户端注意到连接中止。 即使谈到PHP, 这篇文章也是相关的。 这个概念应该是一样的。
有可能的事情,你可以尝试:
如果将当前正在运行的作业保存在数据库中,则可以保存请求标识和/或客户端IP地址。 因此,您可以检测并忽略对同一资源的重复请求,告诉用户“您的请求正在处理中”。
警告:此信息可能已过时。 见最后一段。
我记得有同样的问题,并解决它与nph (没有parsing头)CGI脚本。
通常情况下,apache会收集脚本中的所有头文件,读完头文件后,用一些标准头文件来修改它们。 这也意味着,只要你没有完成标题,apache根本不会向客户端发送任何信息。
使用nph脚本,你必须提供所有的头文件,但是apache会立即把它们发送给客户端,一旦客户端断开连接,你的CGI脚本就会发送一个SIGPIPE消息。 因此,您可以每隔几秒发送一次X-Slowly-Counting-Part-nnn: yes标头,以防止客户端超时,并在客户端断开连接时收到通知。
这仍然会导致您必须首先发送HTTP状态,但是如果您发送“Content-Length:0”或“Content-Length:1”并closures连接而不发送任何内容,则您的文件下载者应该承担networking错误并相应地采取行动。
你可能需要通过你的进程来pipe理其他程序的输出,但是至less如果你在linux上并使用sendfile(2)系统调用,这应该不是一个主要的性能问题。
所有这一切的问题是我至less10年前使用它,可能在Apache 1.3上,谷歌searchapache cgi nph没有产生任何有用的东西。 所以也许nph的function在此期间被取出 – 但是,也许不是,我承认我看起来不是很努力。
老问题,但我有同样的问题,并解决检查连接是否build立:
在我的情况下,我正在服务器上运行一个bash脚本.. envvariables是由mod_cgi导出我相信这个解决scheme将适用于CGI上运行的任何程序/脚本
ss -nt state established "( sport = :$SERVER_PORT and dport = $REMOTE_ADDR:$REMOTE_PORT )" 2>/dev/null | grep -q "$REMOTE_ADDR:$REMOTE_PORT" if [ "$?" -ne '0' ]; then # Client closed browser/connection fi