1. 程式人生 > 實用技巧 >PHP Socket程式設計 之使用fsockopen()函式

PHP Socket程式設計 之使用fsockopen()函式

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

www.example.com

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()並沒有限制。