【PHP網絡技術及應用】
[HTTP協議詳解]
1.HTTP是一個標準的客戶端服務器模型,承載於TCP之上,有時也承載於TLS或SSL之上,此時就是HTTPS。HTTP默認端口80,HTTPS默認端口443.
2.HTTP協議是一個無狀態的協議,同一個客戶端這次請求和上次請求沒有對應關係。
[HTTP協議如何工作]
3. HTTP協議的工作過程可以分爲四部:
(1)客戶機與服務器建立連接
(2)客戶機發送一個請求給服務器
(3)服務器接到請求,給予相應的響應信息
(4)客戶端接收服務器返回的信息並顯示在用戶的顯示屏上
4.HTTP請求的三個組成部分:請求行、消息報頭、請求正文。
5.HTTP響應的三個組成部分:狀態行、消息報頭、響應正文。
6. HTTP消息報頭包括:普通報頭、請求報頭、響應報頭、實體報頭。
s
[HTTP應用:模擬灌水機器人]
7.PHP和HTTP相關的函數:
◆ 簡單的HTTP使用實例
$html = file_get_contents('https://www.baidu.com');
print_r($http_response_header);
$fp = fopen('https://www.baidu.com', 'r');
print_r(stream_get_meta_data($fp));
fclose($fp);
[垃圾信息防禦措施]
IP限制、驗證碼、Token和表單欺騙、審覈機制。
【抓包工具】
◆ Fiddler 的使用
1.安裝後並打開,在瀏覽器訪問:127.0.0.1:8888 可以看到如下信息:
2.如果瀏覽器抓不到包,檢查瀏覽器的代理設置。
3.Fiddler的右鍵基本功能:
4.命令窗口:
select image 選中所有的image類型,按delete即可刪除。
select css 選中所有css請求
@360.cn 選中來自360.cn域名的請求
cls 刪除全部,相當於按下Ctrl+x
5.各類請求前面的圖標所代表的含義:
[使用Fiddler進行HTTP斷點調試]
【Socket進程通信機制及應用】
socket通常被稱爲“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。
[4.3.1-進程通信相關概念]
1.同一主機上,不同進程可用唯一進程號(Process ID)標識。
2.TCP/IP協議引入了下列概念:
① 端口,Protocol Port,有0~65535個端口號。常見的FTP 21端口,HTTP 80端口,SMTP 25端口。
② 地址
③ 連接
[4.3.2-Socket演示:實現服務器端與客戶端的交互]
◆ [代碼] PHP訪問Socket
Linux系統可以使用 tcpdump 命令來獲取數據包。
[4.3.3-Socket函數原型]
[4.3.4-PHP中的Socket函數]
(1)socket_create 用於創建一個Socket
(2)socket_bind 此函數用於將IP地址和端口綁定到socket_create 函數所創建的句柄中。
(3) socket_listen 在綁定Socket後,服務器端使用此函數監聽客戶端數據。
(4)socket_set_block 設置非阻塞模式
(5)socket_write 向Socket寫入數據
(6)socket_read 從Socket中讀取指定長度的數據
(7)pfsockopen 實現長連接。客戶端與服務器端先建立通信連接,不斷開,然後再進行報文發送和接收。
(8)socket_set_option 設置Socket的控制選項。
(9)socket_last_error 返回操作中任何Socket函數產生的最後錯誤,返回值是一個int型的錯誤代號。
◆ [代碼] 在PHP中創建Socket的方法:
[4.3.5-Socket交互應用:使用Socket抓取數據]
【cURL工具及應用】
[4.4.1-建立cURL請求的基本步驟]
1. CURL 支持的協議:HTTP、FTP、Telnet。CURL可以實現Cookie、驗證、表單提交、文件上傳。
2. 建立CURL請求的基本步驟:
[代碼] CURL的具體實現
◆ 基本的抓取網頁
<?php
header("Content-type:text/html;charset=utf-8");
/*CURL的具體實現,抓取網頁,類似於直接file_get_contents() */
//--- 1.初始化
$ch = curl_init();
//--- 2.設置選項,包括url
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com");
//將curl_exec() 獲取的信息以文件流的形式返回,而不是直接輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//啓用時會將頭文件的信息作爲數據流輸出
curl_setopt($ch, CURLOPT_HEADER, 1);
//--- 3.執行並獲取HTML文檔內容
$output = curl_exec($ch);
//--- 4.釋放CURL句柄
curl_close($ch);
echo $output;
?>
◆ 在CURL中添加一段檢查錯誤的語句(雖然不是必需的):
$output = curl_exec($ch);
//添加檢查錯誤的判斷語句,注意下面是===
if($output===FALSE){
echo "CURL Error:".curl_error($ch);
}
//--- 4.釋放CURL句柄
此時,假如抓取一個不存在的網站會出現如下錯誤:
◆ 通過curl_getinfo() 函數返回CURL執行後這一請求的相關信息,對調試和排查錯誤很有用。
$output = curl_exec($ch);
//返回CURL執行後這一請求的相關信息
$info = curl_getinfo($ch);
echo '<pre>';print_r($info);echo '</pre>';exit;
[4.4.2-檢查cURL錯誤和獲取返回信息]
[代碼] 使用CURL抓取網絡圖片(code02.php)
—— 通過比較抓取圖片的大小和文件頭信息,目的是校驗數據是否完整。
@header("Content-type:image/png");
//--- 1.初始化
$ch = curl_init();
//--- 2.設置選項,包括url
curl_setopt($ch, CURLOPT_URL, "http://s.xnimg.cn/xnapp/music/images/404/20121023/404.png");
//將curl_exec() 獲取的信息以文件流的形式返回,而不是直接輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//啓用時會將頭文件的信息作爲數據流輸出
curl_setopt($ch, CURLOPT_HEADER, 1);
//--- 3.執行並獲取HTML文檔內容
$output = curl_exec($ch);
//返回CURL執行後這一請求的相關信息
$info = curl_getinfo($ch);
//--- 4.釋放CURL句柄
curl_close($ch);
//////上面的代碼和之前的code01.php 幾乎一樣,只是抓取的URL不同,重點看下面:
$filename = "F:/data/a.png";
file_put_contents($filename, $output);
$size = filesize($filename);
if($size != $info['size_download']){
echo '下載數據不完整';
//如果不完整,可以考慮嘗試再次下載,最多三次還不成功則放棄,或加入失敗隊列
}else{
echo '數據沒問題';
}
[4.4.3-在cURL中僞造頭信息]
[4.4.4-在cURL中用POST方法發送數據] code03.php
<?php
/**
* 在cURL中用POST方法發送數據
*/
header("Content-type:text/html;charset=utf-8");
//提交後的數據接收部分
if(isset($_GET['type']) && $_GET['type']=='tijiao'){
print_r($_POST);exit;
}
//CURL請求部分
$url = "http://localhost/test/code04/code03.php?type=tijiao";
$post_data = array(
'username'=>'root',
'password'=>'123456',
'name'=>'管理員',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//設置爲POST
curl_setopt($ch, CURLOPT_POST, 1);
//把POST的變量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
?>
[運行結果]
[4.4.5-使用cURL上傳文件] code04.php
<?php
/**
* 使用cURL上傳文件
*/
error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_WARNING);
header("Content-type:text/html;charset=utf-8");
//提交後的數據接收部分
if(isset($_GET['type']) && $_GET['type']=='tijiao'){
echo '<pre>';print_r($_FILES);echo '</pre>';exit;
}
//CURL請求部分
$url = "http://localhost/test/code04/code04.php?type=tijiao";
//注意下面一定要有@符號!
$post_data = array(
'files1'=>'@E:/test/s1.jpg',
'files3'=>'@E:/test/s2.zip',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
?>
[運行結果]
[4.4.6-cURL批處理]
[4.4.7-cURL設置項]
通過 curl_setopt函數設置:
【簡單郵件傳輸協議SMTP】
[4.5.1-SMTP協議如何工作]
◆ SMTP連接和發送過程:
[4.5.2-SMTP協議常用命令]
命令不區分大小寫,但參數區分大小寫。
[4.5.3-SMTP協議應用:使用Socket發送郵件]
fsockopen() 函數的用法:
6-WebService
[代碼] 把XML對象轉換爲數組
1.一個輕量級並且高效的WebService解決方案:PHPRPC
2.PHP支持兩種Web服務模式:WSDL 和 non WSDL;Web服務有兩種實現模式:契約先行模式(Contract First)和 代碼先行模式(Code First)。
3.PHP5新增了內置的SOAP擴展(ext/soap)
(server.php)
<?php
/**
* SOAP:服務器端功能實現
*/
function GetTime(){
return date('Y-m-d',time());
}
class member{
public function add($x,$y){
return $x+$y;
}
}
(proxy.php)
<?php
/**
* SOAP:發佈服務器端所提供的函數和類
*/
include_once 'server.php';
$soap = new SoapServer(null, array('uri'=>"http://test-uri"));
$soap->addFunction('GetTime');
$soap->setClass('member');
$soap->handle();
(client.php)—— 運行此頁面
<?php
/**
* SOAP:客戶端代碼
*/
$data_arr = array(
'location'=>"http://localhost/test/code04.2/proxy.php",
'uri'=>"http://test-uri",
'style'=>SOAP_RPC,
'use'=>SOAP_ENCODED,
'trace'=>1,
'exceptions'=>0
);
$client = new SoapClient(null, $data_arr);
//下面註釋的兩行會報錯
//$rt = $client->GetTime();
//echo $rt.'<br>';
$add_res = $client->add(1,6);
echo $add_res.'<br>'; //輸出 “7”