PHP file_get_contents('http://119.29.29.29/d?dn=baidu.com') 为何失败

2015-03-29 21:28:11 +08:00
 hqfzone

其它网站可以获取到,为什么这个不可以。curl也不行,求解答,谢谢。

6393 次点击
所在节点    PHP
14 条回复
hqfzone
2015-03-29 21:28:49 +08:00
这是DNSPod的IP~
hqfzone
2015-03-29 21:37:31 +08:00
换了学校的VPS以及自己的虚拟机,都有问题~可以获取到httpheader,就是无法获取内容。
l12ab
2015-03-29 21:47:30 +08:00
123.125.114.144;180.149.132.47
Puteulanus
2015-03-29 22:13:47 +08:00

file_get_contents

curl
楼主看看是不是网的问题?
hqfzone
2015-03-29 22:20:28 +08:00
@Puteulanus 应该不是网络问题啊,get_headers('http://119.29.29.29/d?dn=baidu.com')可以获取到httpheader,就是file_get_contents不行。
NewYear
2015-03-29 23:08:09 +08:00
我用file_get_contents获取某大人站的首页做RSS,结果一段时间后被对方服务器B掉了IP……ping都ping不通了。

后来自己请求了下自己网站才发现,坑爹的,这玩意发请求不带user-agent,难怪人家要屏蔽,是我我也屏蔽
txlty
2015-03-29 23:17:52 +08:00
<?php
$fp = fsockopen("119.29.29.29", 80);
fwrite($fp,"GET /d?dn=baidu.com HTTP/1.1\r\n");
fwrite($fp,"Host: 119.29.29.29\r\n");
fwrite($fp,"Connection: Close\r\n\r\n");
for($i=0;$i<6;$i++){$data.=fgets($fp, 128);}
preg_match("/Content-Length:.?(\d+)/", $data, $matches);
$length = $matches[1];
$result = fgets($fp, $length+1);
fclose($fp);
echo $result;
?>
xbonline
2015-03-29 23:40:58 +08:00
这是file_get_contents的坑

因为服务器开启了keep-alive
file_get_contents默认是不发送connection:close头,服务器以为还有后续http请求,所以继续等待几十秒才close,导致file_get_contents阻塞

解决方案: http://stackoverflow.com/questions/3629504/php-file-get-contents-very-slow-when-using-full-url
fising
2015-03-29 23:42:29 +08:00
@xbonline 这不能算坑子
bombless
2015-03-29 23:55:10 +08:00
那就是错误的默认参数吧……
hqfzone
2015-03-30 08:49:11 +08:00
@txlty 这个方法有效,添加useragent或者楼上其它方案均无效,不知为何,谢谢。
mingyun
2015-04-05 19:50:28 +08:00
擦,我试了也不行
hqfzone
2015-04-07 23:03:48 +08:00
@mingyun 用的apache服务器么?不知道楼上测试可以的朋友用的什么……不过 fsockopen 还是可以的。
hqfzone
2015-04-11 13:58:26 +08:00
更正,curl可以~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/180174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX