果某項要求傳送到您的伺服器要求顯示您網站上的某個網頁(例如,使用者透過瀏覽器造訪您的網頁或Googlebot 抓取網頁時),伺服器會傳回HTTP 狀態碼回應請求。
此狀態碼提供關於請求狀態的信息,告訴 Googlebot 關於您的網站和請求的網頁的資訊。
一些常見的狀態碼為:
200 – 伺服器成功返回網頁
404 – 要求的網頁不存在
503 – 伺服器逾時
本文就此簡述php取得網頁請求狀態程式範例如下:
方法一,使用fsockopen
程式碼如下:
function get_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']; return array('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']; return array('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']; return array('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, 'http://www.jb51.net/'); 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; // 500 bytes, it's only a test $len = strlen($data) + strlen($chunk); if ($len >= $limit ) { $data .= substr($chunk, 0, $limit-strlen($data)); echo strlen($data) , ' ', $data; return -1; } $data .= $chunk; return strlen($chunk); }; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.jb51.net/'); 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);
以上是php取得網頁請求狀態代碼範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!