讀寫基本操作
-
寫文件函數:file_put_contents()
-
語法:
`int file_put_contents(file,data,mode,context)` | 參數 | 描述 | -------- | -----: | file | 必需。規定要寫入數據的文件。如果文件不存在,則創建一個新文件。 | data | 可選。規定要寫入文件的數據??梢允亲址?、一維數組或數據流。 | mode | 可選。如何打開/寫入文件。可能值:FILE_USE_INCLUDE_PATH 、 FILE_APPEND 、 LOCK_EX | context | 可選。規定文件句柄的環境。context 是一套可以修改流的行為的選項。若使用 null,則忽略。
返回值:該函數將返回寫入到文件內數據的字節數。
mode參數說明
- FILE_USE_INCLUDE_PATH : 將檢查 filename 副本的內置路徑
- LOCK_EX : 將鎖定文件
- FILE_APPEND : 將移至文件末尾。否則,將會清除文件的內容與依次調用 fopen(),fwrite() 以及 fclose() 功能一樣。
-
-
讀文件函數:file_get_contents()
-
語法:
`string file_put_contents(path,include_path,context,start,max_length)` | 參數 | 描述 | -------- | -----: | path | 必需。規定要讀取的文件。可以是外部url | include_path | 可選。如果也想在 include_path 中搜尋文件的話,可以將該參數設為 "1"。 | context | 可選。規定文件句柄的環境。 | start | 可選。規定在文件中開始讀取的位置。該參數是 PHP 5.1 新加的。 | max_length | 可選。規定讀取的字節數。該參數是 PHP 5.1 新加的。
返回值:讀取到的字符串。
-
其它常用文件函數
- 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)
-
指針操作函數
- fseek(句柄, 位置),定位設置指針,位置從0開始,遞增!
- ftell(句柄),獲取指針位置!
文件并發操作(文件鎖)
默認的,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);
解鎖:
- Flock($handle, LOCK_UN)來強制解鎖,
- Fclose()自動解鎖!