设为首页 收藏本站
查看: 778|回复: 0

[经验分享] php抓取之fread结束判断

[复制链接]

尚未签到

发表于 2017-4-6 10:17:28 | 显示全部楼层 |阅读模式

  楠哥给了个程序,不知道为什么用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);   
}   
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-360921-1-1.html 上篇帖子: PHP小记|设置时区 下篇帖子: php中存储过程的调用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表