使用gethostbyname使stream_socket_client更快?

时间:2011-04-19 11:09:58

标签: php sockets

我们正在与stream_socket_client建立大约100个与不同网站的连接。

有时需要一段时间,我的假设是因为IP地址解析(例如最多40秒,然后重复尝试4-5秒)。

我知道我们也可以在软件中缓存IP地址(使用gethostbyname获取它们),但问题是某些站点在共享IP上,而某些站点使用子域(与主域相同的IP)。因此,如果我们仅使用IP,请求将始终转到相同的位置而不是该IP上的不同站点。

是否有解决方法,以便我们可以提高速度并定位我们想要的网站?

2 个答案:

答案 0 :(得分:2)

DNS缓存是一个很好的主意,但我建议在您的应用程序之外进行;我已经使用PowerDNS recursor多年来取得了优异的成绩,这是很好的可靠代码。 (PDNS通过学习Dan Bernstein的DNS recursor软件避免了一些困扰BIND的标题制定安全漏洞。)

通过在应用程序外部进行缓存,您完全避免了对尝试将IP与请求中的正确Host:标头匹配的问题,您可以完全访问DNS内置的缓存智能。 (PDNS将尊重结果的生存时间,这将使您的团队努力正确地重新实施。)

但是我认为问题的很大一部分是DNS请求可能是在您的应用程序中按顺序进行的,之前返回之后。如果您整天都要使用相同的100个名字,那么单独使用PDNS-recursor可能就足够了。

如果每个请求的100个名称没有太多重叠,那么您可能需要并行化您的应用程序生成的DNS请求,以便您可以拥有100个未完成的DNS同时请求,而不是同时请求一个未完成的请求。一个便宜的'方法是将所有请求转交给外部程序,该程序启动几十个线程并请求所有名称。 (并将它们放在地板上。依靠PDNS-recursor来缓存它们。)还有一点工作就是直接在PHP程序中创建几十个线程或进程来执行所有查找。这可以让你直接使用答案,或者再次在你的旧顺序代码进行查找之前预先填充你的PDNS-recursor缓存。

大部分工作都将完全转移到异步DNS请求,例如libadns库提供的。如果在100个名称查找的不同突发之间存在 no 重叠,这将提供最大的好处。

答案 1 :(得分:1)

如果您将主机名和IP地址输入主机文件(*机器上为/etc/hosts,Windows机器上为%SystemRoot%\system32\drivers\etc\hosts),则可以轻松加快解决速度。

您可能需要更改/etc/host.conf中的配置(我不知道Windows的更改位置),因为默认情况下,首先尝试询问named,然后检查/etc/hosts文件。

要确定系统中实现的gethostbyname函数的工作原理,请尝试找到正确的手册页(即http://linux.die.net/man/3/gethostbyname)。