检查指定的URL是否有效的最快方法是什么? (在确定的http状态码响应)?
现在我正在使用curl,但我有一堆URL在一个循环中testing,所以我正在寻找最快的解决scheme。
任何选项除了wget检查?
我怀疑你会看到的任何性能提高都来自于改进你用来build立连接的包装,而不是为每个URL启动curl 。 无论是curl还是netcat或wget ,您都可能需要单独启动每一个,以分别处理结果。
但我会用两种方式来回答这个问题,只是为了好玩。
首先,你可以在bash中build立TCP连接,而不必像curl / wget / netcat / fetch /等那样启动。 例如:
#!/usr/bin/env bash hostlist=( www.xe.com www.google.com ) for host in "${hostlist[@]}"; do exec 3<>/dev/tcp/$host/80 # open a socket connection on fd/3 printf "HEAD / HTTP/1.0\n\n" >&3 # send a request read -u 3 protocol code message # read the result (first line only) exec 3<&-; exec 3>&- # close fd/3, in and out echo ">> $host -- $code $message ($protocol)" printf ">> %s -- %s %s (%s)\n" "$host" "$code" "${message%?}" "$protocol" done
我在这里发现了这个bash特性的一些很好的文档。
注意$message的处理。 由于这是HTTP协议,因此该行最后有一个\r 。 这剥离它,为更加明智的显示。
请注意,寻找“OK”可能不是你想要做的。 在我上面的例子中, http://www.google.com返回302redirect,而不是200 OK,这是一个非常有效的回应。
还要注意,尝试以这种方式打开连接到不存在的主机是一个错误。 您需要考虑您在此脚本中可能遇到的各种错误情况,以及您想如何处理它们。
第二个select是使用一个允许在一个命令行上提供多个URL的工具。 碰巧, curl是这样做的。 而且你可以用美丽而奇妙的方式来按摩它的输出。 例如:
curl -sL -w "%{http_code} %{url_effective}\\n" \ "http://www.xe.com/" -o /dev/null \ "http://www.google.com" -o /dev/null
请注意,这个解决scheme执行的是HTTP GET而不是HEAD,因此您将传输更多的数据,但获得更“纯”的结果。 如果要通过使用HEAD来节省带宽,请使用curl的-I选项。 (我发现在某些情况下,特别是在使用Java™的情况下,HEAD方法是周期性的没有实现。使用GET可能会增加响应等于提供给浏览器的响应的可能性,尽pipe以额外的带宽。)
不pipe你喜欢,你都可以将你的URL列表的扩展脚本编写成命令行。 当然,如果你处理的是成千上万的URL,你可能想把它们包装在第一个解决scheme中。
也许使用Netcat?
( netcat $domain 80 | head -n 1 ) << EOF HEAD / HTTP/1.0 Host: $domain EOF
输出:
HTTP/1.1 200 OK