在工作中需要用到curl 远程获取数据,但是访问速度太慢了,有时候需要10几秒到20秒,查了下原因,原来是DNS域名解析速度太慢了,所以,这里我们需要先获取抓取网站的域名的IP,然后再进行处理,经过将域名替换为对应的IP后速度大大的提高了,只用不到3秒就可抓取到数据。
请看示例:
// 例如,抓取该网站的信息www.digtime.cn,正常域名速度非常慢,需要十几秒
// $url = 'http://digtime.cn/article/20';
// 根据域名获取IP 120.25.60.5
$ip = gethostbyname("www.digtime.cn");
$url = 'http://'.$ip.'/article/20';
$curl = curl_init ();
curl_setopt ( $curl, CURLOPT_URL, $url );
curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
$output = curl_exec ( $curl );
curl_close ( $curl );
print_r($output);
// 此案例可用于解决微信第三方获取Token信息慢的问题:
function get_token($options)
{
// 域名解析 api.weixin.qq.com => 183.57.48.62
$appid = $options['appid'];
$secret = $options['secret'];
$code = $options['code'];
$url = 'https://183.57.48.62/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';
$curl = curl_init ();
curl_setopt ( $curl, CURLOPT_URL, $url );
curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
$output = curl_exec ( $curl );
curl_close ( $curl );
return json_decode($output, true);
}
所用到的方法参考:
gethostbyname
返回 IP 网址。
语法: string gethostbyname(string hostname);
返回值: 字符串
函数种类: 网络系统
本函数可返回某个机器名称 (Domain Name) 的 IP 网址 (IP Address)。若执行失败,则返回原来的机器名称。
下例的返回值为 140.137.33.246
echo gethostbyaddr("www.hkcc.pccu.edu.tw");
?>