1. 程式人生 > >PHP-模擬請求和操作響應

PHP-模擬請求和操作響應

模擬請求

fsockopen

<?php
// 建立連線
$link = fsockopen('localhost', '80');

define('CRLF', "\r\n");
// 請求行
$request_data = 'GET /'.CRLF;
// 請求頭
$request_data .= 'Host: localhost'.CRLF;
$request_data .= 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0'.CRLF;
$request_data .= 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'.CRLF;
$request_data .= 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'.CRLF;
$request_data .= 'Accept-Encoding: gzip, deflate, br'.CRLF;
$request_data .= 'Cookie: 123'.CRLF;
$request_data .= 'Connection: keep-alive'.CRLF;
$request_data .= 'Upgrade-Insecure-Requests: 1'.CRLF;
// 空行表示請求頭結束
$request_data .= CRLF;

fwrite($link, $request_data);
//feof:(end of file)用於檢測是否到到資料流末尾
while (!feof($link)) {
    echo fgets($link, 1024);
}
fclose($link);

CURL(Client URL)

開啟php_curl.dll拓展

模擬GET請求

<?php
// 建立連線
$curl = curl_init();
//設定
$url = 'localhost';
curl_setopt($curl, CURLOPT_URL, $url);
//傳送
var_dump(curl_exec($curl));
//關閉
curl_close($curl);

POST請求

<?php
// 建立連線
$curl = curl_init();
//設定
$url = 'localhost';
curl_setopt($curl, CURLOPT_URL, $url);
# 設定開啟post請求
curl_setopt($curl, CURLOPT_POST, $url);
$post_data = array(
    'user_name' => 'admin',
    'user_pwd' => '123456'
    );
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//傳送
var_dump(curl_exec($curl));
//關閉
curl_close($curl);

處理響應資料

CURLOPT_RETURNTRANSFER:是將響應直接輸出,還是以返回值的形式處理
以返回值的形式處理響應資料:curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

POST檔案上傳

Post資料使用檔案地址,前使用@標誌為檔案而不是字串
$post_data = array('image' => '@c:/1.jpg');

處理會話COOKIE

CURLOPT_COOKIEFILE:是否傳送cookie
CURLOPT_COOKIEJAR:指定儲存伺服器所設定的cookie變數儲存位置
curl_setopt($curl, CURLOPT_COOKIEFILE, true);


curl_setopt($curl, CURLOPT_HEADER, 'c:/cookie.txt');

處理響應頭

CURLOPT_HEADER:是否獲取響應頭資料
獲取響應頭資料:curl_setopt($curl, CURLOPT_HEADER, true);

操作響應

操作響應頭:

header()函式

  1. json:header("Content-Type: application/json");
    (ie6:header("Content-Type: text/json");
  2. 圖片:header('Content-Type:image/jpeg');header('Content-Type:image/png');等;
  3. 編碼:header("Content-Type:text/html; Charset=utf-8");
  4. 下載:header("Content-Disposition:attachment; filename = \"filename.jpg\"");

操作響應主體

任何的輸出,都是響應主體。(echo,print,var_dump,PHP標籤之外的所有HTML程式碼)

控制瀏覽器快取

header('Expires: ' . gmdate('D, d M Y H:i:s', time()+5) . ' GMT');
Expires:有效期(GMT:格林威治時間)
gmdate() 將時間戳格式化為格林威治平時

<?php
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+5) . ' GMT');
echo time(), "<a href=''>self</a>";

HTTP下載

  1. 直接連結到檔案下載檔案
  2. 通過php下載檔案
    下載:檔案從伺服器端傳輸到瀏覽器端(發生於伺服器響應時)
    PHP僅僅需要將需要下載的內容作為響應主體輸出即可
    通過響應頭:Content-Disposition:告知瀏覽器,接受到響應主體後的處理方式(attachment 表示以附件的方式處理響應主體)
    如果是檔案的下載:將檔案內容作為響應主體輸出即可
<?php
$file = './test.php';

//basename獲取一個地址中的名字部分(最後一個斜槓之後)
header('Content-Disposition: Attachment;filename=' . basename($file));
$finfo = new Finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($file);
header('Content-Type: ' . $mime);
header('Content-Length: ' . filesize($file));

//b 二進位制模式,用於相容處理文字與二進位制檔案
$mode = 'rb';
$handle = fopen($file, $mode);
while(!feof($handle)) {
    echo fgets($handle, 1024);
}
fclose($handle);

跳轉

立即跳轉

Header("Location: URL地址");
注意:

  1. Header()函式前不能存在任何的輸出內容
  2. Header()函式後邊的程式碼也會照常執行

提示跳轉

Header("Refresh: N(秒數); URL=URL地址");
注意:會在當前頁面停留N秒後跳轉到指定URL地址

public function goto($url){
    header("Location:$url");
}
public function info($url, $info, $wait = 3){
    header("Refresh: $wait; URL=$url");
    echo $info;
}
public function success($url, $wait = 3){
    header("Refresh: $wait; URL=$url");
    echo '操作成功';
}
public function error($url, $wait = 3){
    header("Refresh: $wait; URL=$url");
    echo '操作失敗';
}