文件操作
PHP也提供了一套文件操作系統函數。通過這套函數進行文件管理,創建文件、刪除、改名、存儲數據,讀取數據。
文件的理解:在文件管理系統文件分爲兩種
其一就是文件,用於存儲數據
其二是文件夾,用於存儲文件的文件
1. 文件相關信息
函數 | 說明 | 備註 |
---|---|---|
file_exists(filename); | 用於判斷一個文件是否存在 | filename是一個表示文件的完整名的一個字符串 |
filemtime($filename); | 用於獲取文件修改的時間 | 獲得時間戳,用date()轉換爲具體時間 |
filesize($filename); | 用於獲取文件的大小 | 單位爲字節 |
basename(path); | 用於獲取文件名 | |
realpath(path); | 用於判斷path是否是真實存在的一個路徑 | 如果不是返回的是布爾false。如果是那麼會將‘/’轉換爲‘\’,並將相對路徑轉換爲絕對路徑 |
2. 打開文件fopen()
fopen(filename,code); | 用於打開一個文件,用於之後的對文件內容的讀寫操作 |
---|---|
filename | 是一個表示文件的完整名的一個字符串 |
mode | 表示打開的方式 |
mode取值 | 打開文件方式 | 說明 |
---|---|---|
r | 讀 | 文件不存在則報錯 |
r+ | 讀寫 | 文件不存在則報錯 |
w | 寫 | 文件不存在則創建文件,如果文件存在則清空文件 |
w+ | 讀寫 | 文件不存在則創建文件,如果文件存在則清空文件 |
a | 追加 | 文件不存在則創建文件,如果文件存在並不會清空文件 |
a+ | 追加及讀 | 文件不存在則創建文件,如果文件存在並不會清空文件 |
如果以r、r+打開的文件,那麼文件指針位於頭部
如果以a、a+打開的文件,那麼文件指針位於尾部
如果打開成功返回的是一個資源類型:
$filename="./data.txt";
$return=fopen($filename,'r');
var_dump($return);//返回:resource(3, stream)
3. 關閉文件
fclose(handle);
handle是fopen()函數返回的資源
用於判斷handle所指向的文件
$filename="./data.txt";
$return=fopen($filename,'r');
fclose($return);
var_dump($return);//返回resource(3, Unknown)
4. 寫入文件fwrite()
fwrite(handle,data) | - |
---|---|
handle | fopen()函數返回的資源 |
data | 所要寫的數據 如果寫入成功則返回寫入字節數 如果寫入失敗則返回0 |
file_put_contents(filename,data);
用於向文件中寫入數據,特點是文件不需要打開,如果文件存在則清空文件內容
5. 讀取文件內容
函數 | 說明 |
---|---|
fgetc(handle); | 每次從handle所代表的文件中讀取一個字符,文件的指針會下移一行 |
fgets(handle,len); | len表示讀取的字節個數-1,默認是1024 當遇到換行回車時就結束讀取 |
fread(handle,len); | len表示讀取的字節個數,不可以省略 當遇到換行回車時,不受影響 |
file(filename); | 將文件中的每一行讀取的一個元素,並返還整個數組 |
readfile(filename); | filename用於表示文件的字符串 將讀取到的內容自動放到輸出緩存(直接輸出,不需要echo) |
file_get_contents(filename); | 一次性將所有文件讀取出來 |
file()示例:
6. 拷貝文件
copy(source,dest); | 用於複製一個文件,複製文件時可以改名 |
---|---|
source | 源文件 |
dest | 目錄文件 |
7. 刪除文件
unlink(filename); | 用於刪除文件 |
---|
8. 文件的判斷
is_file(filename); | 主要用於區分文件還是文件夾(文件是否存在) |
---|
9. 文件指針(瞭解)
函數 | 說明 |
---|---|
ftell(handle); | 用於獲取文件的指針位置 |
fseek(handle,n,【whence】); | 用於移動文件的指針位置 |
注: | - |
handle | 是fopen函數的返回值,代表實際的文件 |
n | 偏移量 |
whence | 移動的相對位置,取值: SEEK_SET 相對於文件頭 SEEK_END 相對於文件尾 SEEK_CUR 相對於當前位置 |
/打開文件
$filename="./data.txt";
$handle=fopen($filename,'r');
//移動文件指針
$return=fseek($handle,-3,SEEK_END);
echo fgetc($handle);
10. 文件鎖(瞭解)
flock(handle,type); | - |
---|---|
type | 鎖的類型 |
//打開文件
$filename="./data.txt";
$handle=fopen($filename,'r');
//鎖文件
flock($handle,LOCK_EX);
sleep(10);//10秒後解鎖
目錄操作
1. 創建目錄
mkdir(path,mode,recursive); | - |
---|---|
part | 所要創建的文件夾 |
mode | 權限,主要體現在Linux |
recursive | 取值爲布爾值,表示要創建層級文件夾 |
//創建單個文件夾
$folder='Parent';
mkdir($folder);
//創建多級文件夾
$folder='Parent/Childen/';
mkdir($folder,1,true);
2. 打開目錄
opendir(folder); | - |
---|---|
folder | 表示文件夾目錄的一個字符串 如果打開成功返回一個資源類型 |
3. 關閉目錄
closedir(handle); | - |
---|---|
handle | opendir函數的返回值 |
4. 目錄重命名
rename(source,dest); | - |
---|---|
source | 原文件夾 |
dest | 新文件夾名 |
5. 刪除目錄
rmdir(folder);
6. 讀取目錄內容
readdir(handle);
用於讀取文件夾的內容,只能讀取當前層級內容,不能讀取子文件夾中的內容
每次只讀取一個條目,並將指針下移一行
7. 掃描目錄
scandir(folder);
一次性將當前文件夾(不包含子文件夾)中所有內容讀取到數組中,並返還這個數組
8.判斷文件夾
is_dir(dir);
dir就是一個表示文件夾的字符串
用於判斷文件夾
9.遍歷文件夾
//遍歷制定文件夾中的所以內容
//1、設置一個函數,輸出給定的文件夾中所有的內容
//2、如果是文件夾以紅色顯示,如果是文件以藍色顯示(區分文件夾與文件)
//3.如果是子文件夾,再遍歷出子文件夾左右內容
$dir='../demo';
function getTree($dir){
$arr=scandir($dir);
foreach ($arr as $v){
$item=$dir.'/'.$v;
//判斷是否爲文件夾
if(is_dir($item)) {
//如果是文件夾,且不是.獲..,繼續遍歷
if($v=='.'||$v=='..'){
continue;
}
echo '<font color="red">' . $item . '</font>', '<BR>';
getTree($item);
}else{
//如果不是文件夾,直接輸出
echo '<font color="blue">' . $item . '</font>', '<BR>';
}
}
}
getTree($dir);
HTTP協議
1.概念
HyperText Transformation Protocol(超文本傳輸協議)
HTTP互聯網一個基石,就是客戶端與web服務的通訊規則,規定了通訊雙方通許時所採用的格式,以及格式的含義
2.HTTP協議的特點
- 支持c/s(客戶端/服務器)結構
- 簡單,客戶端向服務器端發起請求時,只需要傳遞所請求的文件即可
- 靈活,服務器端向客戶端響應數據,可通過content-type,來設置返回的數據類型
- 無連接,服務器每次只處理一個請求,請求結束後斷開與客戶端的連接
- 無狀態,由於服務器與客戶端具有無連接的特性,所以不瞭解客戶端的本次請求,服務器並不知道本次請求與上次請求是否來源於同一個客戶端,無法跟蹤客戶端的狀態
3.HTTP協議的組成
兩部分組成:
(1).由客戶端發起的請求部分
(2).由服務器端對客戶端的響應部分
4.HTTP請求
http的請求是由瀏覽器根據用戶輸入的URL,或點擊某個頁面上的按鈕,而自動進行組織的
HTTP請求由三部分組成
(1). 請求頭
說明 | 代碼 |
---|---|
請求方式 | GET |
URI(請求的文件名) | /yzf/demo/file.html |
協議及版本號 | HTTP/1.1 |
(2). 報頭
常見 | 說明 |
---|---|
Host | 請求的主機名 |
Connect | 保持連接 |
User-Agent | 瀏覽器的相關信息,會自動攜帶給服務器 |
Accept | 瀏覽器所能處理的數據的格式 |
Accept-Encoding | 瀏覽器所支持的壓縮格式 |
Accept-Language | 瀏覽器所支持的語言 |
If-Modified-Since | 用於詢問當前所請求的內容,自從上次是否有修改過 |
(3). 空行
空行作用是用於分隔協議頭與實際的數據
5.HTTP響應
HTTP協議的響應是由web服務器根據用戶的請求,進行處理後,自動進行組織的
(1).響應行
- | - |
---|---|
協議及版本號 | HTTP/1.1 |
狀態碼 | 200 |
狀態描述 | OK |
常見的狀態碼 | 描述 |
---|---|
200 | 成功 |
404 | 請求文件不存在 |
403 | 沒有權限 |
(2).響應的報頭
- | 說明 |
---|---|
Date | 時間 |
Server | 服務器的相關信息 |
Last-Modified | 與客戶端請求頭中的Last-Modified-Since對應 |
Content-Type | 此次響應的數據是什麼格式,默認都是text/html |
Accept-Length | 所返回的數據的長度317 |
Accept-Range | 返回的數據的單位 |
(3). 空行
空行作用是用於分隔協議頭與響應的實際的數據
6.PHP操作和HTTP響應頭
默認HTTP協議的響應頭是由web服務器自動組織,PHP爲我們提供了一個設置HTTP響應的協議頭的函數header
(1).設置瀏覽器顯示編碼
header(‘Content-Type:text/html;charset=utf8’);
(2).用於進行跳轉
header(‘location:url’);
(3).下載
//1.通過協議頭告訴瀏覽器端,將要發送的數據,不能使用圖片格式,而應該作爲一個應用程序數據
header('Content-Type:application/octet-stream');
//2.通過協議頭告訴瀏覽器,將要發送的數據,作爲附件下載
header('Content-disposition:attachment;filename=ok..png');
$return=file_get_contents('3.png');
數據採集(瞭解)
1.什麼是數據採集
我們創建網站是爲了顯示數據,但有一些數據的獲取成本非常高。所謂的數據採集就是將別人網站的數據,爲我們所用。
2.curl函數
Curl是一個代碼版的瀏覽器。允許我們在代碼中像使用瀏覽器一樣訪問別人的頁面。默認PHP並沒有開啓對curl的支持,需要自己在配置文件中手動開啓。
提示:如果開啓後也無法使用,需要將php目錄中的4個文件libeay32.dll、libss32.dll、ssleay32.dll、php5ts.dll文件複製到Apache的bin目錄中
一般配置好wamp64都是默認開啓的
3.curl函數的使用
(1).初始化curl(打開一個瀏覽器)
curl_init()
(2).設置參數(輸入地址)
curl_setopt(curl,參數名,參數值); | - |
---|---|
curl | 就是curl_init的返回值 |
參數名 | 參數都是以常量的形式設計的 |
CURLOPT_URL | 用於設置所請求的網址 |
CURLOPT_RETURNTRANSFER | 取值若爲1,表示不將收到的數據直接返回給瀏覽器,而是作爲curl_exec()函數的返回值 |
CURLOPT_POST | 取值爲1 |
CURLOPT_POSTFIELDS | 用於設置post請求所攜帶的數據 |
(3).執行curl(回車)
curl_exec(); 用於執行某個curl工具
//1.初始化curl(打開一個瀏覽器)
$ci=curl_init();
//2.設置curl選項(輸入地址)
curl_setopt($ci,CURLOPT_URL,'http://www.baidu.com');
curl_setopt($ci,CURLOPT_RETURNTRANSFER,1);
//3.執行curl(回車)
$html= curl_exec($ci);
file_put_contents('test.txt',$html);
4.模擬get請求
5.模擬post請求
//1.初始化curl(打開一個瀏覽器)
$ci=curl_init();
//2.設置curl選項(輸入地址)
$url='http://localhost/yzf/news/php/insertNews.php';
curl_setopt($ci,CURLOPT_URL,$url);
curl_setopt($ci,CURLOPT_RETURNTRANSFER,1);
//設置post請求方式
curl_setopt($ci,CURLOPT_POST,1);
//定義數據
$data=['n_name'=>'^_^','n_id'=>2,'n_sort'=>100,'n_dest'=>'測試','n_content'=>'unstopable'];
curl_setopt($ci,CURLOPT_POSTFIELDS,$data);
for($i=0;$i<3;$i++) {
//3.執行curl(回車)
curl_exec($ci);