我正在尝试在 PHP 中构建一个监控站点/服务器正常运行时间的系统,该系统将需要每分钟检查数千个域/ips。我研究了 cURL,因为这似乎是最好的方法。
编辑:系统将需要探测服务器,检查其响应时间是否合理,并返回其响应代码。然后它将向包含响应时间和状态代码的 mysql 数据库添加一行。系统的通知部分从那里相当直接。该系统将在专用服务器上。希望这会增加一些清晰度。
我正在尝试在 PHP 中构建一个监控站点/服务器正常运行时间的系统,该系统将需要每分钟检查数千个域/ips。我研究了 cURL,因为这似乎是最好的方法。
编辑:系统将需要探测服务器,检查其响应时间是否合理,并返回其响应代码。然后它将向包含响应时间和状态代码的 mysql 数据库添加一行。系统的通知部分从那里相当直接。该系统将在专用服务器上。希望这会增加一些清晰度。
如果我理解正确,您的这个系统将不断连接到数千个域/IP,如果它有效,它假设服务器已启动并正在运行?
我想你可以使用 cURL,但它会花费很长时间,特别是如果你正在谈论数千个请求 - 你需要多个服务器和大量带宽才能正常工作。
您还可以查看多线程请求的 multi cURL(即同时发送 10 个以上的 cURL 请求,而不是一次发送一个)。
有很多很好的工具来处理这样的事情。不需要自己写。
以Nagios为例。许多管理员使用它进行监控。
为什么不采用 KISS 方法并使用 php 的get_headers()函数呢?
如果您想检索状态代码,这里是从注释到 php 手册页的片段:
function get_http_response_code($theURL) {
$headers = get_headers($theURL);
return substr($headers[0], 9, 3);
}
这个函数(作为一个核心的 php 特性)应该比 curl 更快、更高效。
您的瓶颈将在于等待给定主机响应。给定 30 秒超时和 N 个要检查的主机,并且除最后一个主机之外的所有主机都没有响应,您需要等待 30(N-1) 秒才能检查最后一个主机。您可能永远无法检查最后一个主机。
您当然需要发送多个 HTTP 请求 - 或者是已经建议的多个 cURL,或者用于 OO 方法的HttpRequestPool类。
您还需要考虑如何将 N 个主机的集合分解为最大数量的子集,以避免由于必须首先处理无响应主机队列而无法到达主机的问题。
检查来自 1 个服务器的 N 个主机表示由于无响应主机队列而无法到达一个或多个主机的最大机会。这是最便宜、最简单和最不可靠的选择。
从 N 个服务器中分别检查 1 台主机表示由于无响应主机队列而无法到达一台主机而未到达一台或多台主机的可能性最小。这是最昂贵、(可能)最困难和最可靠的选择。
考虑最适合您的成本/难度/可靠性平衡。