日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

三、PHP基础——HTTP协议 文件编程

發(fā)布時間:2024/7/5 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三、PHP基础——HTTP协议 文件编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、HTTP協(xié)議初步認識

HTTP協(xié)議概念
HTTP協(xié)議,即超文本傳輸協(xié)議(Hypertext transfer protocol)。是一種詳細規(guī)定了瀏覽器和萬維網(wǎng)(WWW = World Wide Web)服務(wù)器之間互相通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
HTTP協(xié)議是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等。
HTTP協(xié)議特點:
1)客戶/服務(wù)器模式:客戶端(瀏覽器)/服務(wù)端
2)簡單快速:客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
3)靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象(MIME類型)
4)無連接:無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
5)無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。
HTTP協(xié)議分類
1)http請求協(xié)議:瀏覽器向服務(wù)器發(fā)起請求的時候需要遵循的協(xié)議
2)http響應(yīng)協(xié)議:服務(wù)器向瀏覽器發(fā)起響應(yīng)的時候需要遵循的協(xié)議
HTTP請求
請求行
1)形式:請求方式 資源路徑 協(xié)議版本號
2)GET /index.php HTTP/1.1

最早的時候HTTP協(xié)議有過1.0,請求行獨占一行(第一行)
請求頭
請求頭就是各項協(xié)議內(nèi)容:具體的協(xié)議內(nèi)容不會每次都使用全部
1)Host:請求的主機地址(必須)
2)Accept:當(dāng)前請求能夠接收服務(wù)器返回的類型(MIME類型)
3)Accept-Language:接收的語言
4)User-Agent:客戶瀏覽器所在點的一些信息

請求頭不固定數(shù)量,每個請求協(xié)議也是獨占一行,最后會有一行空行(用來區(qū)分請求頭和請求體)
請求體
請求數(shù)據(jù):POST請求會有請求體。GET請求所有的數(shù)據(jù)都是跟在URL之后,會在請求行中的資源路徑上體現(xiàn)。

基本格式:資源名字=資源值&資源名字=資源值…

二、HTTP響應(yīng)

響應(yīng)行
1)形式:協(xié)議版本號 狀態(tài)碼 狀態(tài)消息(獨占一行)
HTTP/1.1 200 ok
2)200 ok: 成功
3)403 Forbidden: 沒權(quán)限訪問
4)404 Not Found: 未找到頁面
5)500 Server Internal Error: 服務(wù)器內(nèi)部錯誤
響應(yīng)頭
具體協(xié)議內(nèi)容
1)時間:Wed, 16 Sep 2017 11:43:33 GMT
2)服務(wù)器:Server: Apache/2.2.22 (Win32) PHP/5.3.13
3)內(nèi)容長度:Content-Length: 1571,數(shù)據(jù)具體的字節(jié)數(shù)(響應(yīng)體)
4)內(nèi)容類型:Content-Type: text/html:告訴瀏覽器對應(yīng)的數(shù)據(jù)格式

列舉了幾個常見的響應(yīng)頭,并不是全部:響應(yīng)頭一個占一行,最后一行空行(區(qū)分響應(yīng)頭和響應(yīng)體)
響應(yīng)體
實際服務(wù)器響應(yīng)給瀏覽器的內(nèi)容

常用HTTP狀態(tài)碼
狀態(tài)碼200:成功
狀態(tài)碼403:forbidden,拒絕訪問(沒有權(quán)限)
狀態(tài)碼404:NOT FOUND,找不到
狀態(tài)碼500:服務(wù)器問題

服務(wù)器正在處理過程中

服務(wù)器正常且正確處理

請求的目標(biāo)已經(jīng)轉(zhuǎn)移或者需要更新

客戶端出錯了

服務(wù)器出錯

HTTP響應(yīng)
常見HTTP響應(yīng)設(shè)置及使用
PHP中針對HTTP協(xié)議(響應(yīng))進行了底層設(shè)計,可以通過函數(shù)header來實現(xiàn)修改HTTP響應(yīng)(響應(yīng)頭)

注意事項:
1、 Header可以設(shè)計HTTP響應(yīng),因為HTTP協(xié)議特點是:響應(yīng)行,響應(yīng)頭(空行結(jié)尾),響應(yīng)體。認為通過header設(shè)計響應(yīng)頭的時候,不應(yīng)該有任何內(nèi)容輸出,所以一旦產(chǎn)生內(nèi)容輸出(哪怕一個空格),系統(tǒng)都會認為響應(yīng)頭已經(jīng)結(jié)束而響應(yīng)體開始了,所有如果先輸出內(nèi)容后設(shè)置響應(yīng)頭(header使用),理論設(shè)置無效;
2、 在PHP5以后,增加程序緩存內(nèi)容:允許服務(wù)器腳本在輸出內(nèi)容的時候,不直接返回瀏覽器而是現(xiàn)在服務(wù)器端使用程序緩存保留(php.ini中使用output_buffering),有了該內(nèi)容之后,在程序緩存內(nèi)會自動調(diào)整響應(yīng)頭和響應(yīng)體(允許響應(yīng)頭在已經(jīng)輸出的內(nèi)容之后再設(shè)置),但是此時會報錯(警告)。
總結(jié):header設(shè)置響應(yīng)體之前不要有任何輸出

Location:重定向,立即跳轉(zhuǎn)(響應(yīng)體不用解析)
瀏覽器在解析服務(wù)器響應(yīng)的時候:先判定響應(yīng)行,繼續(xù)響應(yīng)頭,最后響應(yīng)體:location是在響應(yīng)頭中,所以瀏覽器一旦見到該協(xié)議項,不再向下解析。

Refresh:重定向,定時跳轉(zhuǎn)(響應(yīng)體會解析)
延時重定向:瀏覽器會根據(jù)具體時間延遲后在訪問指定跳轉(zhuǎn)鏈接:瀏覽器在準(zhǔn)備跳轉(zhuǎn)訪問之前,會繼續(xù)解析HTTP協(xié)議(響應(yīng)頭和響應(yīng)體)

Content-type:內(nèi)容類型,MIME類型
通過內(nèi)容告知(MIME類型),瀏覽器正確解析內(nèi)容

Content-disposition:內(nèi)容類型,MIME類型擴展,激活瀏覽器文件下載對話框
瀏覽器在解析內(nèi)容的時候,默認是直接解析:那么有時候需要瀏覽器不解析,當(dāng)做內(nèi)容下載成文件

PHP模擬HTTP請求
原理
PHP可以通過模擬HTTP協(xié)議發(fā)起HTTP請求
CURL是一個非常強大的開源庫,支持很多協(xié)議,包括HTTP、FTP、TELNET等,我們使用它來發(fā)送HTTP請求。它給我 們帶來的好處是可以通過靈活的選項設(shè)置不同的HTTP協(xié)議參數(shù),并且支持HTTPS。CURL可以根據(jù)URL前綴是“HTTP” 還是“HTTPS”自動選擇是否加密發(fā)送內(nèi)容。

前提條件:HTTP協(xié)議的客戶端/服務(wù)端模式,HTTP協(xié)議不局限于一定要瀏覽器訪問

Curl擴展庫使用
1、 開啟CURL擴展

2、 有的時候PHP版本會出現(xiàn)即使開啟了擴展也無法使用擴展的可能:因為CURL找不到對應(yīng)的dll文件:需要將相關(guān)的DLL文件放到C:windows

3、 重啟Apache應(yīng)用

1)建立連接:curl_init():激活一個CURL連接功能

2)設(shè)置請求選項:curl_setOpt():設(shè)定選項
CURLOPT_URL:連接對象
CURLOPT_RETURNTRANSFER:將服務(wù)器執(zhí)行的結(jié)果(響應(yīng))以文件流的形式返回給請求界面(PHP腳本)
CURLOPT_POST:是否才有POST方式發(fā)起請求(默認請求是GET)
CURLOPT_POSTFIELDS:用來傳遞POST提交的數(shù)據(jù),分為兩種方式:字符串(name=abc&password=123)以及數(shù)組形式(array(‘name’=>’abc’,…))
CURLOPT_HEADER:是否得到響應(yīng)的header信息(響應(yīng)頭),默認不獲取

3)執(zhí)行請求:curl_exec():執(zhí)行選項(與服務(wù)器發(fā)起請求),得到服務(wù)器返回的內(nèi)容

亂碼原因:20select.php中的內(nèi)容有告知瀏覽器,但是當(dāng)前是被服務(wù)器腳本23curl_http.php訪問的,沒有做解析;輸出給瀏覽器之后,需要當(dāng)前23curl_http.php告知瀏覽器對應(yīng)的字符集
4)關(guān)閉連接:curl_close():關(guān)閉資源

三、文件編程

文件編程初步認識
文件編程的必要性
文件編程指利用PHP代碼針對文件(文件夾)進行增刪改查操作。

在實際開發(fā)項目中,會有很多內(nèi)容(文件上傳、配置文件等)具有很多不確定性,不能在一開始就手動的創(chuàng)建,需要根據(jù)實際需求和數(shù)據(jù)本身來進行管理,這個時候就可以使用PHP文件編程來實現(xiàn)代碼批量控制和其他操作。
文件操作的分類
1) 目錄操作:文件夾,用來存放文件的特殊文件
2) 文件操作:用來存放內(nèi)容
目錄操作
文件操作創(chuàng)建目錄結(jié)構(gòu)
1)mkDir(路徑名字):創(chuàng)建成功返回true,創(chuàng)建失敗返回false

有些操作為的就是得到一個想要的結(jié)果,如果結(jié)果本身就存在,那么可以忽略得到過程的錯誤:抑制錯誤

刪除目錄
1)rmDir(指定文件夾路徑):移出文件夾

讀取目錄
讀取方式:將文件夾(路徑)按照資源方式打開

1)openDir():打開資源,返回一個路徑資源,包含指定目錄下的所有文件(文件夾)

2)readDir():從資源中讀取指針?biāo)谖恢玫奈募?#xff0c;然后指針下移,直到指針移出資源

讀取所有內(nèi)容:遍歷操作

關(guān)閉目錄
1)closeDir():關(guān)閉資源

其他目錄操作
1)dirName(一個路徑):得到的是路徑的上一層路徑

2)realPath(一個路徑):得到真實路徑(目錄路徑),如果文件不存在,那么得到的結(jié)果是false

3)is_dir():判斷指定路徑是否是一個目錄

4)scandir():封裝版的opendir\readdir\closedir,獲取一個指定路徑下的所有文件信息,以數(shù)組形式返回

目錄操作
遞歸遍歷目錄
遞歸遍歷目錄:指定一個目錄的情況下,將其下的所有文件和目錄,及其目錄內(nèi)部的所有內(nèi)容都輸出出來。

遞歸算法:將大問題切成相似的小問題(最小單位),然后可以調(diào)用解決大問題的方法來解決小問題。
遞歸函數(shù):函數(shù)如果自己內(nèi)部調(diào)用自己,該函數(shù)稱之為遞歸函數(shù)。

遞歸遍歷目錄的思維邏輯
1、 設(shè)計一個能夠遍歷一層文件的函數(shù)
a. 創(chuàng)建函數(shù)

b. 安全判定:是路徑才訪問

c. 讀取全部內(nèi)容,遍歷輸出

2、 找到遞歸點:遍歷得到的文件是目錄,應(yīng)該調(diào)用當(dāng)前函數(shù)(調(diào)用自己):
a. 需要構(gòu)造路徑(遍歷得到的結(jié)果只是文件的名字)

b. 需要注意排除.和…

c. 判斷是路徑還是文件

d. 遞歸調(diào)用函數(shù)

3、 找到遞歸出口:遍歷完這個文件夾之后,發(fā)現(xiàn)沒有任何子文件夾(函數(shù)不再調(diào)用自己):自帶遞歸出口
4、 如何顯示層級關(guān)系?函數(shù)第一次運行遍歷的結(jié)果是最外層目錄,內(nèi)部調(diào)用一次說明進入一個子目錄,子目錄再調(diào)用一次函數(shù)進行孫子目錄…如果能夠在第一次調(diào)用的時候給個標(biāo)記,然后在進入的時候,通過標(biāo)記的變化來識別層級關(guān)系,就可以達到目的:該標(biāo)記還能代表層次關(guān)系:縮進
a. 在函數(shù)參數(shù)中增加一個標(biāo)記:默認值為0

b. 遞歸調(diào)用函數(shù)的時候也需要使用該參數(shù):但是是屬于當(dāng)前層級的子層,所以+1

c. 根據(jù)層級來實現(xiàn)縮進:str_repeat()

<?php// 遞歸遍歷文件夾// 定義路徑 $dir = 'uploads';/** 創(chuàng)建函數(shù):能夠訪問指定路徑下的所有文件,且判斷出* 是目錄還是文件* @param1 string $dir ,指定路徑* @param2 int $level=0 ,層級,默認頂層* */ function my_scandir($dir,$level=0) {// 保證文件安全:如果不是路徑?jīng)]有必要往下執(zhí)行if (!is_dir($dir)){die($dir . '<br/>');}// 讀取全部路徑信息,遍歷輸出$files = scandir($dir);foreach ($files as $file){// $file就是一個個文件名echo str_repeat("&nbsp;&nbsp;",$level), $file . '<br/>';// 排除. 和 ..if ($file =='.' || $file == '..') continue;// 構(gòu)造路徑$file_dir = $dir . '/' . $file;// 判斷路徑if (is_dir($file_dir)){// 遞歸點my_scandir($file_dir,$level + 1);}} }my_scandir($dir);

文件操作
PHP5常見文件操作函數(shù)
1)file_get_contents(文件路徑):獲取指定文件的所有內(nèi)容,如果路徑不存在最好做安全處理

2)file_put_contents(文件路徑,內(nèi)容):將指定內(nèi)容寫入到指定文件內(nèi):如果當(dāng)前路徑下不存在指定的文件,函數(shù)會自動創(chuàng)建(如果路徑不存在,不會創(chuàng)建路徑)

PHP4常見文件操作函數(shù)
PHP4中是將文件操作用資源形式處理:不論是讀還是寫都依賴資源指針:文件內(nèi)容中指針?biāo)谖恢谩?br /> 1)fopen(文件路徑,打開模式):打開一個文件資源,限定打開模式

2)fread(資源,長度):從打開的資源中讀取指定長度的內(nèi)容(字節(jié))

3)fwrite(資源,內(nèi)容):向打開的資源中寫入指定的內(nèi)容

4)fclose(資源):關(guān)閉資源

其他文件操作函數(shù)
1)is_file():判斷文件是否正確(不識別路徑)
2)filesize():獲取文件大小
3)file_exists():判斷文件是否存在(識別路徑)
4)unLink():取消文件名字與磁盤地址的連接(刪除文件)
5)filemtime():獲取文件最后一次修改的時間
6)fseek():設(shè)定fopen打開的文件的指針位置
7)fgetc():一次獲取一個字符
8)fgets():一次獲取一個字符串(默認行)
9)file():讀取整個文件,類似file_get_contents,區(qū)別是按行讀取,返回一個數(shù)組
文件操作
文件下載
文件下載:從服務(wù)器將文件通過HTTP協(xié)議傳輸?shù)綖g覽器,瀏覽器不解析保存成相應(yīng)的文件。
提供下載方式可以使用HTML中的a標(biāo)簽:點擊下載
1、 缺點1:a標(biāo)簽?zāi)軌蜃尀g覽器自動下載的內(nèi)容有限:瀏覽器是發(fā)現(xiàn)如果解析不了才會啟用下載
2、 缺點2:a標(biāo)簽下載的文件存儲路徑會需要通過href屬性寫出來,這樣會暴露服務(wù)器存儲數(shù)據(jù)的位置(不安全)

PHP下載:讀取文件內(nèi)容,以文件流的形式傳遞給瀏覽器:在響應(yīng)頭中告知瀏覽器不要解析,激活下載框?qū)崿F(xiàn)下載。
1)指定瀏覽器解析字符集

2)設(shè)定響應(yīng)頭
a)設(shè)定文件返回類型:image/jpg||application/octem-stream
b)設(shè)定返回文件計算方式:Accept-ranges:bytes
c)設(shè)定下載提示:Content-disposition:attachment;filename=’文件名字’
d)設(shè)定文件大小:Accept-length:文件大小(字節(jié))

3)讀取文件
4)輸出文件
方案1:如果文件較小,可以使用PHP5的文件函數(shù)操作:file_get_contents

方案2:文件比較大(網(wǎng)絡(luò)不好),可以使用PHP4 的文件操作方式:一次讀一點

<?php// PHP文件下載// 設(shè)定解析字符集 header('Content-type:text/html;charset=utf-8');$file = '27-file_download.php';// 設(shè)定下載響應(yīng)頭 // 以文件流形式傳輸數(shù)據(jù)給瀏覽器 header('Content-type:application/octem-stream'); // 以字節(jié)方式計算 header('Accept-ranges:bytes'); // 附件下載,指定命名 header('Content-dispositon:attachment;filename=' . $file); // 設(shè)定文件大小(字節(jié)) header('Accept-length:' . filesize($file));// 注意: // 如果文件的名字是從文件夾讀取出來的,而且存在中文,那么如果直接使用名字作為下載名字會出現(xiàn)亂碼 // 出現(xiàn)這種情況需要進行字符集轉(zhuǎn)碼: // 從GBK轉(zhuǎn)成UTF-8:$file = iconv('GBK','utf-8',$file);// 輸出文件 // php5: 小文件 //echo file_get_contents($file);// php4:大文件 $f = @fopen($file, 'r') or die(); while ($row = fread($f,1024)) {echo $row; }/*while (!feof($f)) {echo fread($f,1024); }*/// 關(guān)閉資源 fclose($f);

總結(jié)

以上是生活随笔為你收集整理的三、PHP基础——HTTP协议 文件编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。