Php 批量检查一百万个域的HTTP头

Php 批量检查一百万个域的HTTP头,php,python,ruby,http,asynchronous,Php,Python,Ruby,Http,Asynchronous,我正在查看超过一百万个域的HTTP头(即查找200/404/302) 此时,我不需要主体HTML(尽管稍后可能会用到),因此最好使用HEAD请求,而不是GET。我知道有些服务器不支持HEAD,为了简单起见,他们愿意牺牲那些不可勾选的服务器 我尝试过许多用PHP编写的解决方案(curl、multi-curl、几个DIY curl并行选项),但都不够快 我很乐意使用任何语言,理想的结果是找到一个已经编译好的C应用程序,只需获取一个URL列表并吐出标题。例如,我使用一个预滚DNS应用程序来检查所有这些

我正在查看超过一百万个域的HTTP头(即查找200/404/302)

此时,我不需要主体HTML(尽管稍后可能会用到),因此最好使用HEAD请求,而不是GET。我知道有些服务器不支持HEAD,为了简单起见,他们愿意牺牲那些不可勾选的服务器

我尝试过许多用PHP编写的解决方案(curl、multi-curl、几个DIY curl并行选项),但都不够快

我很乐意使用任何语言,理想的结果是找到一个已经编译好的C应用程序,只需获取一个URL列表并吐出标题。例如,我使用一个预滚DNS应用程序来检查所有这些域的DNS设置,我所要做的就是打开一个到它的管道并向它提供域,当它们进入时,它会吐回答案(不一定以相同的顺序)

它需要异步或线程化才能足够快

我探索了一些python选项(如TwistedFramework和liburl2),但无法启动并运行任何可靠的东西


希望有人能帮我找到一个现成的解决方案

看看,尤其是基于它的库。例如:

看看,尤其是基于它的库。例如:

首先,对于那些因为鱼腥味而否决该问题的人:这就是谷歌所做的。我非常感谢他们这么做。据我们所知,这位先生或女士正在打造一个更好的搜索引擎,我们将在8年后使用它

但正如流氓程序员所说:我们不应该都这么粗心大意

关于问题:您无法获取域的标题。您可以通过完成对URL的HTTP请求来获取标题

至于解决方案:您可以将python与许多可用的http库中的一个结合使用,比如内置的httplib。由于请求量很大,您需要使用线程来并行地发出多个请求。下面的例子太简单了。在现实生活中,您将使用线程池。此外,同时拥有多个连接也会带来自身的问题。那么:你希望它有多快

import httplib
from threading import Thread
import time

hosts = [ 'www.google.com', 'www.yahoo.com', 'nos.nl' ]
responses = {}

class StatusChecker(Thread):

    def __init__(self, hostname):
        Thread.__init__(self)
        self.hostname = hostname

    def run(self):
        conn = httplib.HTTPConnection(self.hostname)
        conn.request("HEAD", "/index.html")
        res = conn.getresponse()
        responses[self.hostname] = res.status



if __name__ == "__main__":
    for h in hosts:
        StatusChecker(h).start()

    time.sleep(10)
    print responses
这将产生如下结果:

$ python test.py
{'nos.nl': 200, 'www.yahoo.com': 301, 'www.google.com': 200}

首先,对于那些因为怀疑而否决这个问题的人来说:谷歌就是这么做的。我非常感谢他们这么做。据我们所知,这位先生或女士正在打造一个更好的搜索引擎,我们将在8年后使用它

但正如流氓程序员所说:我们不应该都这么粗心大意

关于问题:您无法获取域的标题。您可以通过完成对URL的HTTP请求来获取标题

至于解决方案:您可以将python与许多可用的http库中的一个结合使用,比如内置的httplib。由于请求量很大,您需要使用线程来并行地发出多个请求。下面的例子太简单了。在现实生活中,您将使用线程池。此外,同时拥有多个连接也会带来自身的问题。那么:你希望它有多快

import httplib
from threading import Thread
import time

hosts = [ 'www.google.com', 'www.yahoo.com', 'nos.nl' ]
responses = {}

class StatusChecker(Thread):

    def __init__(self, hostname):
        Thread.__init__(self)
        self.hostname = hostname

    def run(self):
        conn = httplib.HTTPConnection(self.hostname)
        conn.request("HEAD", "/index.html")
        res = conn.getresponse()
        responses[self.hostname] = res.status



if __name__ == "__main__":
    for h in hosts:
        StatusChecker(h).start()

    time.sleep(10)
    print responses
这将产生如下结果:

$ python test.py
{'nos.nl': 200, 'www.yahoo.com': 301, 'www.google.com': 200}

这看起来一点也不可疑……@RogueCoder当然不是。我确信它有一个完全合法的用途。在许多语言中,这对于cURL来说都是微不足道的。你遇到了什么问题?@David这是真的,即使OP打算将此用于合法目的,如果操作不当或过于频繁,可能会导致他所轮询的域出现问题。@RogueCoder,这是可疑的。这看起来一点也不可疑。@RogueCoder当然不是。我确信它有一个完全合法的用途。在许多语言中,这对于cURL来说都是微不足道的。您遇到了什么问题?@David这是真的,即使OP打算将此用于合法目的,如果操作不当或过于频繁,可能会导致他正在轮询的域出现问题。@RogueCoder,这是值得怀疑的。