我们通过stream_socket_client向不同的网站开放了大约100个连接。
有时这需要一段时间,我的假设是因为IP地址解析(例如,最多40秒,然后重复尝试4-5秒)。
我知道我们也可以在软件中缓存IP地址(使用gethostbyname获取它们),但问题是一些站点在共享IP上,一些站点使用子域(与主域相同的IP)。因此,如果我们仅使用IP,则请求将始终转到同一位置,而不是该IP上的不同站点。
有没有一个变通的方法,这样我们就可以提高速度,并针对我们想要的网站?
发布于 2011-04-19 19:32:01
DNS缓存是一个很好的想法,但我建议在您的应用程序之外使用它;我已经使用PowerDNS recursor多年了,效果非常好,它是很好的可靠代码。(通过学习丹·伯恩斯坦的DNS递归软件,PDNS避免了一些困扰BIND的头条新闻安全缺陷。)
通过在应用程序外部进行缓存,您可以完全避免在请求中尝试将IP与正确的DNS头匹配的问题,并且您可以完全访问Host:
的内置缓存智能。(PDNS将尊重结果的生存时间,这需要您的团队努力才能正确地重新实现。)
但我假设很大一部分问题是,DNS请求可能是在前一个请求返回之后,在您的应用程序中按顺序发出的。如果你打算整天使用相同的100个名字,那么单独使用PDNS-recursor可能就足够了。
如果每个请求的100个名称没有太多重叠,那么您可能需要并行化应用程序发出的DNS请求,以便可以同时有100个未完成的DNS请求,而不是同时只有一个未完成的请求。一种“廉价”的方法是将所有请求传递给外部程序,该程序启动几十个线程,并对所有名称发出请求。(然后把它们扔到地板上。依靠PDNS-recursor将它们全部缓存。)更多的工作是直接在PHP程序中创建几十个线程或进程来执行所有查找。这将允许您直接使用答案,或者再次,在旧的顺序代码执行查找之前预先填充PDNS-递归缓存。
最重要的工作是完全转移到异步DNS请求上,如libadns
库所提供的。如果100个名称查找的不同突发之间没有重叠,这将提供最大的好处。
发布于 2011-04-19 19:24:25
如果您在hosts文件中输入主机名和ip地址(在*nix计算机上为/etc/hosts
,在Windows计算机上为%SystemRoot%\system32\drivers\etc\hosts
),则可以轻松地加快解析速度。
您可能必须在/etc/host.conf
中更改配置(我不知道在哪里更改),因为在默认情况下,第一次尝试是询问指定的,然后检查/etc/hosts
文件。
要确保在您的系统中实现的gethostbyname
函数是如何工作的,请尝试查找正确的手册页(即http://linux.die.net/man/3/gethostbyname)。
https://stackoverflow.com/questions/5715424
复制相似问题