Socket可以理解為兩台計算機相互通信的通道。
用法:使用fsockopen()函數
具體用法詳見上篇文章。函數的參數為URL、端口號、一個存放錯誤編號的變量、一個存放錯誤信息字符串的變量和超時等待時間。(只有第一個參數是必須的)
常見的端口表:
端口號 |
主要用途 |
21 |
FTP |
22 |
SSH |
23 |
Telnet |
25 |
SMTP |
80 |
Web |
110 |
POP |
其中,組成URl的幾個部分為:協議名(scheme),主機(host),端口號(port),文件路徑(path),查詢參數(query)。
當url是http://www.example.com/view.php?week=1#demo時:
指標 |
值 |
Scheme |
http |
Host |
|
Port |
80 |
User |
|
Pass |
|
Path |
View.php |
Query |
Week=1 |
Fragment |
#demo |
常見的HTTP狀態碼:
代碼 |
含義 |
200 |
OK |
204 |
NO Content |
400 |
Bad Request |
401 |
Unauthorized |
403 |
Forbidden |
404 |
Not Found |
408 |
Time out |
5** |
Server error |
【示例】:
<?PHP function check_url($url){ //解析url $url_pieces = parse_url($url); //設置正確的路徑和端口號 $path =(isset($url_pieces['path']))?$url_pieces['path']:'/'; $port =(isset($url_pieces['port']))?$url_pieces['port']:'80'; //用fsockopen()嘗試連接 if($fp =fsockopen($url_pieces['host'],$port,$errno,$errstr,30)){ //建立成功后,向服務器寫入數據 $send = "HEAD $path HTTP/1.1\r\n"; $send .= "HOST:$url_pieces['host']\r\n"; $send .= "CONNECTION: CLOSE\r\n\r\n"; fwrite($fp,$send); //檢索HTTP狀態碼 $data = fgets($fp,128); //關閉連接 fclose($fp); //返回狀態碼和類信息 list($response,$code) = explode(' ',$data); if(code == 200){ return array($code,'good'); }else{ return array($code,'bad');//數組第二個元素作為css類名 } }else{ //沒有連接 return array($errstr,'bad'); } } //創建URL列表 $urls = array( 'http://www.sdust.com', 'http://www.example.com' ) //調整PHP腳本的時間限制: set_time_limit(0);//無限長時間完成任務 //逐個驗證url: foreach($urls as $url){ list($code,$class) = check_url($url); echo "<p><a href =\"$url\">$url</a>(<span class =\"$class\">$code</span>)</p>"; } ?>
使用fsockopen()函數比fopen()函數的優點:fopen()只會在PHP中已經將allow_url_fopen設置為真時才能使用,而fsockopen()並沒有限制。