`
guoxinzz
  • 浏览: 434267 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

php抓取之fread结束判断

 
阅读更多

楠哥给了个程序,不知道为什么用fsocket链接,然后用fread或fgets读数据,每一步都是跟手册一致,但是feof总是没有办法正确判断已经到文件尾部,必须要等到超时才推出……所以速度超级慢……
构造头部部分及链接部分手册有很多例子,不再赘述……
解决办法如下:
$sock = fsockopen($host_url,80,$errno,$errstr,5);
stream_set_timeout($sock, 1);//设置流超时,如果对方服务器缓慢的话你可以设的值大一些~~
$temp='';
while (($temp=fread($sock,8096))) {//每次读取8096字节,如果对方的网速偏慢的话也适当减小
$body.=$temp;
}
echo $body;
ok,很简单吧~~~
设置流超时为1秒,然后每次判断fread获取的是否为空,若为空的话则说明已经读取结束,若不设置流超时,默认可能要等待60秒吧……
终于知道为什么之前没办法判断结束了……
在构造头部的时候没有加入Connection: Closernrn这一句做结束,所以feof就总是无法判断结束,貌似是持久链接的问题,具体rfc描述如下:
一些客户机和服务器可能希望和一些对以前实现HTTP/1.0持续连接的客户机和服务器兼容。单个持续连接不是缺省的行为的时候,它就被明确的越过。HTTP/1.0持续连接的实验性实现是有缺陷的,在HTTP/1.1中设计新的简单的来纠正这些问题。问题是一些现有的1.0客户机可能发送Keep-Alive给一个不明白这种连接的代理服务器,那么就错误地将它传向下一个接收服务器,它将建立一个Keep-Alive连接并导致一个挂着的HTTP/1.0代理等待关闭的应答。结果是HTTP/1.0客户机必须禁止使用Keep-Alive和代理交谈。 然而,和代理交谈是持续连接最重要的用处,所以禁止很明显是无法接受的。因此,我们需要一些其它的机制来表明渴望持续连接,甚至当和一个忽略Connection的老代理交谈这样使用也是安全的。对HTTP/1. 0消息持续连接是缺省的;我们引入一个新的关键字(Connection:close)来申明非持续。
最新测试发现只要传递Connection: 任意字符甚至可以为空rnrn都feof都能正常获取结束标志……看来是头部构造的不完整……
不知道,我也不知道,哪位大仙知道为啥跟我说一下吧~~~~
发个正确的函数(不是我写~~~)
function get_content($url){
$urlparts = parse_url($url);
$script_name = $urlparts['path'];
$host_url = $urlparts['host'];
$fp = fsockopen($host_url, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)
n";
} else {
$out = "GET / HTTP/1.1rn";
$out .= "Host: www.ea3w.comrn";
//$out .= "添加头部的其他部分";
$out .= "Connection: Closernrn";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 1028);
}
fclose($fp);
}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics