本文主要和大家分享php檔案基本操作執行個體,希望能協助到大家,首先我們先和大家分享php讀寫基本操作。
讀寫基本操作
其它熱門檔案函數
Unlink() 刪除檔案
Rename() 檔案移動(重新命名)
Filesize() 檔案大小
File_exists() 檔案是否存在
Filemtime() 檔案的最後修改時間!
檔案控制代碼讀寫操作
大多數的檔案讀寫,使用函數:File_put_contents, file_get_contents完成。
少數,特別情況,以上兩個函數不好用。
典型的就是,檔案過大!只能一部分一部分的操作!
基本單位都是位元組:
fopen() 函數開啟檔案或者 URL。
如果開啟失敗,本函數返回 FALSE。
開啟檔案控制代碼,PHP程式與檔案間資料通路!
需要 檔案地址 和 開啟模式 兩個參數!
開啟模式:指定開啟該檔案後,需要執行什麼操作!如下的模式可以選擇:
r: read, 讀模式。
w: write, 寫操作,清空寫。
a: append,寫操作,追加寫。
x: 建立寫,只能建立檔案進行操作!就是寫操作,與w類似
+擴充模式:擴充的操作,都可以完成讀寫操作。
<?php $handle = fopen('./data.txt','r'); var_dump($handle); // resoure(3) of type (stream) 得到一個資源類型?>
檔案控制代碼讀函數fread(),fgetc(),fgets(),feof();
一個位元組資料 = fgetc(控制代碼); //多位元組字元情況下亂碼
每當讀取到一個位元組,將檔案指標向前移動一個位元組!控制代碼操作中,依賴的就是 檔案指標!
字串 = fgets(控制代碼, 長度)
如果在讀取時,先讀到了分行符號,也會終止。也叫讀行函數!典型的邏輯,每行記錄一組資訊,該函數最常用!
feof()判斷是否達到檔案末尾
讀取檔案全部資訊例子:
<?php $handle = fopen('./langref.txt','r'); while (! feof($handle)) { $line = fgets($handle,1024); echo $line . "</br>"; }?>
字串 = fread(handle,長度)
依據長度讀取內容,與fgets區別,不受分行符號的限制
唯一一個限制為:最大的長度不能超過8192!
檔案控制代碼寫函數fwrite($handle,內容)
關閉控制代碼fclose($handle)
指標操作函數
檔案並行作業(檔案鎖)
預設的,PHP的檔案操作函數,不是阻塞狀態。自由操作狀態。所以並行作業檔案的時候容易導致出錯,當需要,一個指令碼操作而需要阻塞另外的指令碼操作時,需要用到檔案鎖。
鎖操作流程:
先加鎖,檢測鎖是否加成功,如果成功再使用!
鎖定類型:
讀鎖: s-lock(share-lock)共用鎖定,讀操作前,期望增加的鎖定。導致,允許並發讀,阻塞額外的寫操作。
寫鎖: x-lock(exclusive-lock)獨佔鎖定,獨佔鎖,寫操作前,嘗試添加的鎖定類型。導致,其他指令碼不能讀也不能寫。
意圖鎖定:所有的操作資源的指令碼都遵循一個約定來使用檔案鎖(約定)。
flock($handle,鎖類型);
類型:
LOCK_SH 讀鎖
LOCK_EX 寫鎖
LOCK_UN 解鎖
<?php //*********指令碼1,想要讀取檔案資訊*********** //嘗試加讀鎖 $lock_result= flock($handle, LOCK_SH); //判斷鎖定結果 if(!$lock_result){ die('鎖定失敗,不能操作檔案'); } //檔案操作 $str = fgets($handle, 1024); var_dump($str); sleep(5); echo '<br>'; $str = fgets($handle, 1024); var_dump($str); flock($handle, LOCK_UN);//解鎖?><?php //*********指令碼2,想要往檔案裡寫入資訊*********** //嘗試加寫鎖 $lock_result= flock($handle, LOCK_EX); //判斷鎖定結果 if(!$lock_result){ die('鎖定失敗,不能操作檔案'); } //檔案操作 $result = fwrite($handle, '123456'); flock($handle, LOCK_UN);//解鎖?>同事執行的情況下,上述指令碼2需要等待(被阻塞狀態)指令碼1執行完成才會執行,強調,一定要判斷鎖是否添加成功
可以通過LOCK_NB來在鎖定失敗時,不阻塞:
$lock_result = flock($handle, LOCK_EX | LOCK_NB);
解鎖: