比 curl 更快的 ping URL 方式

比 curl 更快的 ping URL 方式

检查指定 URL 是否正常工作的最快方法是什么?(以 OK http 状态代码响应)?

目前我正在使用 curl,但我有很多 URL 需要循环测试,所以我正在寻找最快的解决方案。

除了 wget 之外还有其他选项可以检查吗?

答案1

我怀疑您看到的任何性能提升都来自改进您用于建立连接的任何包装器,而不是每个 URL 启动的开销curl。无论是curl还是netcatwget您可能都希望分别启动它们,以便分别处理它们的结果。

但我会用两种方式回答这个问题,只是为了好玩。

首先,你实际上,在 bash 中建立 TCP 连接,而不必启动 curl/wget/netcat/fetch/etc 之类的程序。例如:

#!/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”可能不是您想要做的。在我上面的例子中,www.google.com返回 302 重定向而不是 200 OK,这是一个完全有效的响应。

还请注意,尝试以这种方式打开与不存在的主机的连接是错误的。您需要考虑在此脚本中可能遇到的各种错误情况,以及如何处理它们。

第二种选择是使用允许在一个命令行上提供多个 URL 的工具。碰巧的是,它确实curl做到了这一点。而且你可以用漂亮而奇妙的方式修改它的输出。例如:

curl -sL -w "%{http_code} %{url_effective}\\n" \ 
 "http://www.xe.com/" -o /dev/null \
 "http://www.google.com" -o /dev/null

请注意,此解决方案执行的是 HTTP GET 而不是 HEAD,因此您传输的数据更多,但结果更“纯粹”。如果您想通过使用 HEAD 节省带宽,请使用 curl 的-I选项。(我发现在某些情况下,尤其是使用 Java™ 时,HEAD 方法有时不会实现。使用 GET 可能会增加响应与提供给浏览器的响应相同的可能性,但会以额外的带宽为代价。)

您可以按照自己的喜好将 URL 列表的扩展编写到命令行中。当然,如果您要处理成千上万个 URL,您可能还是希望在第一个解决方案中将它们包装起来。

答案2

也许使用 Netcat?

( netcat $domain 80 | head -n 1 ) << EOF
HEAD / HTTP/1.0
Host: $domain


EOF

输出:

HTTP/1.1 200 OK

相关内容