PHP筆記11-網絡數據傳輸

【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

2socket_bind    此函數用於將IP地址和端口綁定到socket_create 函數所創建的句柄中。

3 socket_listen       在綁定Socket後,服務器端使用此函數監聽客戶端數據。

4socket_set_block       設置非阻塞模式

5socket_write     Socket寫入數據

6socket_read       Socket中讀取指定長度的數據

7pfsockopen        實現長連接。客戶端與服務器端先建立通信連接,不斷開,然後再進行報文發送和接收。

8socket_set_option     設置Socket的控制選項。

9socket_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”

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章