PHP Socket程式設計 之使用fsockopen()函式
阿新 • • 發佈:2020-07-13
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()並沒有限制。