换行循环以使用HTTP流水线

时间:2015-09-13 02:56:31

标签: python perl curl sh keep-alive

我有一个脚本,每隔Y分钟就会多次向同一个服务器发出X请求,而且当前不使用任何流水线操作/ HTTP Keep-Alive,部分原因是每个请求必须在输出中以头部开头。

#!/bin/sh -x
for k in $(jot 6)
  do
    while read i
      do
        echo -n $i
        curl -s "http://example.org/?param=$i" | fgrep result
    done <<EOF
some
uri
data
here
EOF
    sleep 600
done

我想要的是将其转换为每个批次使用example.com的单个连接,而不是为每个请求建立一个新连接。

请注意,由于必须打印标题,例如,流水线操作会很复杂。 echo -n $i

约束:每个请求可能有一行或一行与我们尝试fgrep的字符串匹配(因此,当前脚本也会部分损坏,因为它如果有0行,则不会打印\n

我理想情况下正在寻找sh解决方案,但我也可以使用perlpython2.7,如果这不会花费太长时间。 (以及curlwget,以及OpenBSD的所有其他内容。)

1 个答案:

答案 0 :(得分:1)

纯粹的基于shell的解决方案可能无法工作,因为在执行keep-alive / pipelining时必须重用相同的TCP连接。但是,你当前的解决方案并不是完全基于shell的,因为它一直调用curl和fgrep,如果这是你对shell解决方案的理解,那么你的shell也可以调用Perl和Python。

我建议只使用LWP(Perl)或请求(Python)库,它们都使用HTTP keep-alive。关于如何使用这些库有足够的例子,所以不需要在这里重复它。除了版本之间的行为可能不同之外(例如,如果默认情况下是否保持HTTP keep-alive,并且未知OpenBSD版本上安装了哪些版本)。 HTTP流水线操作更难,但在大多数情况下不会比保持活动更加快速(可能用于非常小的请求)。另请注意,keep-alive并不会神奇地加速所有内容,因为它也必须在服务器端支持。虽然大多数服务器实现它,但有时会关闭它以使用更少的资源。