当前位置 > it书童 > php > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

php中curl解析dns太慢的大坑

php it书童 2019-10-05 11:47:23 0赞 0踩 1779阅读 0评论

虽然很不喜欢用php的curl函数,无奈工作中还是需要用到,总觉得配置太繁琐,远不如python的requests来得简洁。

今天又踩到了curl的大坑,用curl检测url的http状态码,设置连接超时为3秒,结果所有url都显示超时,直接将url丢到浏览器却是秒开,用wget也是秒下载,而且使用python的requests也是返回正常的200状态

无解之下,google搜索curl slow,发现原来是curl在解析dns时极其慢,有多慢?贴代码为证:

$url = 'http://example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, TRUE); // 不输出内容
curl_exec($ch);
if (!curl_errno($ch)) {
    $info = curl_getinfo($ch);
    var_dump($info); // 打印curl信息
}

dns解析时间足足用了75秒,如此丧心病狂!这个坑未免也太大了...

既然知道了坑,总能找到办法填上,给curl指定ip即可跳过dns解析

代码优化为:

$url = 'http://example.com';
$url_arr = parse_url($url);
$host = $url_arr['host'];
$ip = gethostbyname($host); // 获取ip
$ch = curl_init();
// 指定ip
curl_setopt($ch, CURLOPT_URL, str_replace($host, $ip, $url));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: {$host}"));
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_exec($ch);
if (!curl_errno($ch)) {
    $info = curl_getinfo($ch);
    var_dump($info);
}

运行结果:

这下子可以愉快地玩耍了...

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/282/a-big-hole-in-php-where-curl-parsing-dns-is-too-slow