php获取网页请求状态程序示例
对于网页返回状态代码一般情况下我们都会去查自己网站状态码是不是200或错误页面是不是404代码,并且多数情况下我们的查看方法就是使用站长工具或ff浏览器等来查看,极少有人想到自己写一个查看状态代码的功能。
本文就此简述php获取网页请求状态程序示例如下:
方法一,使用fsockopen
(不推荐使用curl_getinfo!)
functionget_http_code($url="localhost",$port=80,$fsock_timeout=10){ set_time_limit(0); ignore_user_abort(true); //记录开始时间 list($usec,$sec)=explode("",microtime(true)); $timer['start']=(float)$usec+(float)$sec; //校验URL if(!preg_match("/^https?:\/\//i",$url)){ $url="http://".$url; } //支持HTTPS if(preg_match("/^https:\/\//i",$url)){ $port=443; } //解析URL $urlinfo=parse_url($url); if(empty($urlinfo['path'])){ $urlinfo['path']='/'; } $host=$urlinfo['host']; $uri=$urlinfo['path'].(empty($urlinfo['query'])?'':$urlinfo['query']); //通过fsock打开连接 if(!$fp=fsockopen($host,$port,$errno,$error,$fsock_timeout)){ list($usec,$sec)=explode("",microtime(true)); $timer['end']=(float)$usec+(float)$sec; $usetime=(float)$timer['end']-(float)$timer['start']; returnarray('code'=>-1,'usetime'=>$usetime); } //提交请求 $status=socket_get_status($fp); $out="GET{$uri}HTTP/1.1\r\n"; $out.="Host:{$host}\r\n"; $out.="Connection:Close\r\n\r\n"; $write=fwrite($fp,$out); if(!$write){ list($usec,$sec)=explode("",microtime(true)); $timer['end']=(float)$usec+(float)$sec; $usetime=(float)$timer['end']-(float)$timer['start']; returnarray('code'=>-2,'usetime'=>$usetime); } $ret=fgets($fp,1024); preg_match("/http\/\d\.\d\s(\d+)/i",$ret,$m); $code=$m[1]; fclose($fp); list($usec,$sec)=explode("",microtime(true)); $timer['end']=(float)$usec+(float)$sec; $usetime=(float)$timer['end']-(float)$timer['start']; returnarray('code'=>$code,'usetime'=>$usetime); }
file_get_contents是fsockopen功能的简单打包,效率稍低些,但是抓取成功率很高,所以在snoopy出问题的时候我一般拿他来用。5.0.0添加了对context的支持,有了context,他也可以发送header信息,自定义用户agent,referer,cookies都不在话下。5.1.0添加了offset和maxlen参数,可以只读文件的一部分内容。
方法二,使用snoopy.class.php
Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。
$ch=curl_init(); curl_setopt($ch,CURLOPT_URL,'https://www.nhooo.com/'); curl_setopt($ch,CURLOPT_RANGE,'0-500'); curl_setopt($ch,CURLOPT_BINARYTRANSFER,1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $result=curl_exec($ch); curl_close($ch); echo$result;
$writefn=function($ch,$chunk){ static$data=''; static$limit=500;//500bytes,it'sonlyatest $len=strlen($data)+strlen($chunk); if($len>=$limit){ $data.=substr($chunk,0,$limit-strlen($data)); echostrlen($data),'',$data; return-1; } $data.=$chunk; returnstrlen($chunk); }; $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,'https://www.nhooo.com/'); curl_setopt($ch,CURLOPT_RANGE,'0-500'); curl_setopt($ch,CURLOPT_BINARYTRANSFER,1); curl_setopt($ch,CURLOPT_WRITEFUNCTION,$writefn); $result=curl_exec($ch); curl_close($ch);