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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

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

一、HTTP協議初步認識

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

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

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

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

二、HTTP響應

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

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

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

服務器正在處理過程中

服務器正常且正確處理

請求的目標已經轉移或者需要更新

客戶端出錯了

服務器出錯

HTTP響應
常見HTTP響應設置及使用
PHP中針對HTTP協議(響應)進行了底層設計,可以通過函數header來實現修改HTTP響應(響應頭)

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

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

Refresh:重定向,定時跳轉(響應體會解析)
延時重定向:瀏覽器會根據具體時間延遲后在訪問指定跳轉鏈接:瀏覽器在準備跳轉訪問之前,會繼續解析HTTP協議(響應頭和響應體)

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

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

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

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

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

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

3、 重啟Apache應用

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

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

3)執行請求:curl_exec():執行選項(與服務器發起請求),得到服務器返回的內容

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

三、文件編程

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

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

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

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

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

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

2)readDir():從資源中讀取指針所在位置的文件名字,然后指針下移,直到指針移出資源

讀取所有內容:遍歷操作

關閉目錄
1)closeDir():關閉資源

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

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

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

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

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

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

遞歸遍歷目錄的思維邏輯
1、 設計一個能夠遍歷一層文件的函數
a. 創建函數

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

c. 讀取全部內容,遍歷輸出

2、 找到遞歸點:遍歷得到的文件是目錄,應該調用當前函數(調用自己):
a. 需要構造路徑(遍歷得到的結果只是文件的名字)

b. 需要注意排除.和…

c. 判斷是路徑還是文件

d. 遞歸調用函數

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

b. 遞歸調用函數的時候也需要使用該參數:但是是屬于當前層級的子層,所以+1

c. 根據層級來實現縮進:str_repeat()

<?php// 遞歸遍歷文件夾// 定義路徑 $dir = 'uploads';/** 創建函數:能夠訪問指定路徑下的所有文件,且判斷出* 是目錄還是文件* @param1 string $dir ,指定路徑* @param2 int $level=0 ,層級,默認頂層* */ function my_scandir($dir,$level=0) {// 保證文件安全:如果不是路徑沒有必要往下執行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;// 構造路徑$file_dir = $dir . '/' . $file;// 判斷路徑if (is_dir($file_dir)){// 遞歸點my_scandir($file_dir,$level + 1);}} }my_scandir($dir);

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

2)file_put_contents(文件路徑,內容):將指定內容寫入到指定文件內:如果當前路徑下不存在指定的文件,函數會自動創建(如果路徑不存在,不會創建路徑)

PHP4常見文件操作函數
PHP4中是將文件操作用資源形式處理:不論是讀還是寫都依賴資源指針:文件內容中指針所在位置。
1)fopen(文件路徑,打開模式):打開一個文件資源,限定打開模式

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

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

4)fclose(資源):關閉資源

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

PHP下載:讀取文件內容,以文件流的形式傳遞給瀏覽器:在響應頭中告知瀏覽器不要解析,激活下載框實現下載。
1)指定瀏覽器解析字符集

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

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

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

<?php// PHP文件下載// 設定解析字符集 header('Content-type:text/html;charset=utf-8');$file = '27-file_download.php';// 設定下載響應頭 // 以文件流形式傳輸數據給瀏覽器 header('Content-type:application/octem-stream'); // 以字節方式計算 header('Accept-ranges:bytes'); // 附件下載,指定命名 header('Content-dispositon:attachment;filename=' . $file); // 設定文件大小(字節) header('Accept-length:' . filesize($file));// 注意: // 如果文件的名字是從文件夾讀取出來的,而且存在中文,那么如果直接使用名字作為下載名字會出現亂碼 // 出現這種情況需要進行字符集轉碼: // 從GBK轉成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); }*/// 關閉資源 fclose($f);

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。