PHP网络编程
(1)通過訪問文件的方式訪問其他網(wǎng)站:
任何一個網(wǎng)站的url地址其實(shí)都是一該網(wǎng)頁文件的路徑,所以我們可以用打開文件的方式來打開網(wǎng)頁的文件。
之后我們可以將其內(nèi)容寫入我們自己的文件中。以此方法我們可以將多個網(wǎng)站中我們感興趣的內(nèi)容搜索并保存到我們自己的文檔中。
比如可以實(shí)行以下方法:
$url_list = file("http://www.baidu.com/");$demo_web = fopen("demo_web.php",'a');foreach($url_list as $one_list){fwrite($demo_web,$one_list); }fclose($url_list);?
(2)PHP對URL的解析:
URL的基本組成成分:協(xié)議名(scheme)、主機(jī)名(host)、端口號(port)、文件路徑(path)、查詢參數(shù)(query)
?
php可以使用parse_url()函數(shù)來解析url,將需要解析的url作為參數(shù)傳給這個函數(shù),這個函數(shù)會將url變成數(shù)組。
該數(shù)組中各個鍵值名和所對應(yīng)的意思就是我上面列的“基本成分”。
如:$demo = parse_url("http://www.example.com/index.php");
$demo['host']就是“www.example.com” ? ? ? ?$demo['path']就是index.php
?
(3)PHPsocket編程:
?socket運(yùn)行的基本機(jī)制:
在服務(wù)器和客戶端上各建一個socket就可以進(jìn)行通信了。
服務(wù)器端:服務(wù)器先初始化socket,之后綁定端口,再對端口進(jìn)行監(jiān)聽,最后調(diào)用accept先將服務(wù)器端的socket阻塞住,等待客戶端的socket連接。
客戶端:先初始化一個socket,之后連接到阻塞中服務(wù)器端socket,如果連接成功,則客戶端與服務(wù)器的連接就建立了。
客戶端發(fā)送數(shù)據(jù)請求,服務(wù)器端接收并處理請求,然后把回應(yīng)數(shù)據(jù)發(fā)送到客戶端,客戶端讀取數(shù)據(jù),最后關(guān)閉連接,這樣一次交互就結(jié)束了。
?
而在php中如果要打開一個socket,需要使用到fsockopen()函數(shù)。
fsockopen()函數(shù)的參數(shù)依次為:URL、端口號、一個存放錯誤編號的變量、一個存放錯誤信息字符串的變量、超時等待時間。(只有第一個參數(shù)為必須的)。
這個fsockopen()函數(shù)和fopen()函數(shù)類似,得到的都是一個文件指針,所以也可以使用fwrite()等操作文件的函數(shù)
在使用fsockopen()建立了連接后,則使用fwrite()函數(shù)向服務(wù)器寫入一些數(shù)據(jù),如:
$fp = fsockopen("www.example.com",80,$errno,$errstr,30); if(!$fp){echo "連接失敗"; }else{$send = "HEAD /HTTP/1.1\r\n";$send .= "HOST: www.example.com\r\n";$send .= "CONNECTION: Close\r\n\r\n";fwrite($fp,$send);$data = fgets($fp,128); //檢索HTTP頭的128個字符串fclose($fp); //關(guān)閉socket //用explode函數(shù)將$data從空格處打散為兩個字符串,再由list函數(shù)將前一個字符串賦值給$response變量,將后面的字符串賦值給$code字符串。list($response,$code)= explode(' ',$data); }關(guān)于上面的代碼:
1、寫入$fp的$send字符串實(shí)際上是利用“一系列HTTP協(xié)議頭來啟動通信過程”,如“HEAD/HTTP/1.1\r\n”其中的HEAD就是請求類型,當(dāng)然也可以用GET或POST來請求,而后面的\r\n只是為了滿足格式而已。(同理下面增加進(jìn)$send的兩個字符串也都是HTTP協(xié)議頭)
2、通過fwrite發(fā)送HTTP報頭后,該$fp會返回自己的HTTP報頭,通過fgets()函數(shù)讀取其中的128個字符串,并賦值給$data,這個$data中的空格后面的字符串被賦給了$code。
而這個$code就是HTTP狀態(tài)碼,只有當(dāng)這個狀態(tài)碼為200時,表示該URL為可用的,任何其他數(shù)值的狀態(tài)碼都表示存在問題。
?
(4)使用cURL:
cURL的作用是“模擬瀏覽器請求”,我們可以用cURL細(xì)化我們的http請求功能,而不僅僅是人工瀏覽一個頁面。
php可以通過shell_exec()及其他函數(shù)來調(diào)用cURL,甚至還有一套cURL類庫:libcurl,操作步驟如下:
1、以要訪問的URL作為參數(shù),調(diào)用curl_init()來開始一個cURL事務(wù)
$cur = curl_init('www.example.com');該函數(shù)會返回該cURL事務(wù)的指針,我們接下來就是操作這個事務(wù)的指針。
2、接下來我們要多次調(diào)用curl_setopt()函數(shù)來設(shè)置該事務(wù)的選項(xiàng)(可設(shè)置的選項(xiàng)太多,在這不一一列舉了),語法如下:
curl_setopt($curl,"可設(shè)置的選項(xiàng)",value);3、設(shè)置完所有選項(xiàng)后,使用curl_exec()函數(shù)來執(zhí)行該事務(wù),將返回的數(shù)據(jù)賦給一個變量:
$result = curl_exec($curl);4、最后,關(guān)閉該鏈接:
curl_close($curl);?
下面列舉幾個常用的設(shè)置選項(xiàng):
1、告訴cURL,如果發(fā)生錯誤,直接停止運(yùn)行:
curl_setopt($curl,CURLOPT_FAILONERROR,1);2、設(shè)置超時時間:
curl_setopt($curl,CURLOAPT_TIMEOUT,5);3、設(shè)置cURL使用POST方法提交數(shù)據(jù):
curl_setopt($curl,CURLOAPT_POST,1);4、設(shè)置POST提交的數(shù)據(jù):
curl_setopt($curl,CURLOAPT_POSTFIELDS,'name=小明&age=12');(Tip:cURL工具還能夠傳送、接收cookie,處理文件上傳,通過SSL連接工作,處理FTP文件)
?
轉(zhuǎn)載于:https://www.cnblogs.com/red-code/p/5324133.html
總結(jié)
- 上一篇: linux pthread
- 下一篇: ibatis mybatis传入List