php基礎系列之 數據的存儲和讀取


·文件處理
·寫入一個文件
1,打開這個文件。如果這個文件不存在,需要先創建它
2,將數據寫入這個文件
3,關閉這個文件
·從一個文件讀出數據
1,打開這個文件。如果這個文件不能打開(例如,文件不存在),就應該意識到這一點並且正確退出
2,從這個文件中讀出數據
3,關閉這個文件
·打開文件
要在php中打開一個文件,可以使用fopen()函數。當打開一個文件的時候,還需要指定如何使用它。也就是文件模式
·選擇文件模式
打開一個文件,有三種選擇,只讀、只寫、或者讀和寫。函數fopen()支持這三種方式的組合
·fopen()
·$_SERVER['DOCUMENT_ROOT'] :PHP預定義的幾個變量之一;作用:獲取當前Web服務器文檔樹的根目錄(絕對路徑)
使用'..'表示這個文檔根目錄的父目錄
·在UNIX環境下,目錄中的間隔符是正斜線(/)。如果是window平台,可以使用正斜線或者反斜線。如果使用反斜線,就必須使用
轉義(標記為一個特殊)字符.
$fp = fopen("$_SERVER['DOCUMENT_ROOT']\\..\\orders\\orders.txt",'w');
·在PHP代碼中,很少人使用反斜線,因為這意味着代碼只能在Windows上運行
·fopen()函數的第二個參數是文件模式,它是一個字符串,指定了將對文件進行的操作
模式 模式名稱 意義
r 只讀 讀模式---打開文件,從文件頭開始讀
r+ 只讀 讀寫模式---打開文件,從文件頭開始讀寫
w 只寫 寫模式---打開文件,從文件頭開始寫。如果該文件已存在,將刪除所有文件已有內容。如果文件不存在,函數將創建這個文件
w+ 只寫 寫模式---打開文件,從文件頭開始讀寫。如果該文件已存在,將刪除所有文件已有內容。如果文件不存在,函數將創建這個文件
x 謹慎寫 寫模式打開文件,從文件頭開始寫,如果文件已存在,該文件將不會被打開,fopen()函數將返回false,而PHP將產生一個警告
x+ 謹慎寫 寫模式打開文件,從文件頭開始讀寫,如果文件已存在,該文件將不會被打開,fopen()函數將返回false,而PHP將產生一個警告
a 追加 追加模式---打開文件,如果該文件已有內容,將從文件末尾開始追加寫,如果該文件不存在,函數將創建這個文件
a+ 追加 追加模式---打開文件,如果該文件已有內容,將從文件末尾開始追加寫(或者讀),如果該文件不存在,函數將創建這個文件
b 二進制 二進制模式---用於與其他模式進行連接。如果文件系統能夠區分二進制文件和文本文件,你可能會使用它。Windows系統可以區分,而UNIX則不區分。推薦一直使用這個選項,以便獲得最大程度的可移植性。二進制模式是默認的模式
t 文本 用於與其他模式的結合,這個模式只是windows系統下一個選項。它不是推薦選項,除非你曾經在代碼中使用了b選項

·正確的文件模式取決於系統如何使用它。我們已經使用了"w",這表示只可以將一個訂單寫入文件中。每當一個新訂單被寫入文件,它將覆蓋以前的訂單。這樣做可能沒有
什么意義,所有最好使用追加模式(以及推薦的二進制模式):
$fp = fopen("$_SERVER['DOCUMENT_ROOT']/../orders/orders.txt",'ab');
·fopen ()成功打開一個文件,該函數將返回一個指向這個文件的文件指針。在上面這個示例中
,文件指針保存在$fp中,當讀者的確希望能夠讀寫這個文件時,將使用這個變量來訪問文件。
·解決打開文件時可能遇到的問題
當打開文件時,可能經常遇到的錯誤是試圖也會在Windows平台上遇到)打開一個沒有讀寫權限的文件(這種錯誤通常只會在類似UNIX的操作系統中見到,但是偶爾會在Windows平台上遇到。
·寫文件
在php中寫文件相對比較簡單。可以使用fwrite()
·fwrite()參數
實際上,fwrite()具有3個參數,但是第3個參數是可選的。fwrite()的原型如下代碼所示:
int fwrite ( resource handle , string [, int length])
第3個參數length是寫入的最大字符數。如果給出了這個參數,fwrite()將向handle指向的文件寫入字符串string,一直寫到字符串的末尾,或者已經寫入了length
字節,滿足這兩個條件之一就停止寫入。
可以通過php的內置strlen()函數獲得字符串的長度:
fwrite($fp , $outputstring , strlen($outputstring));
當使用二進制模式執行寫操作時,你可能希望使用第3個參數,因為它可以幫助你避免一些跨平台兼容問題
·關閉文件
當使用完文件后,應該將其關閉。應該按照如下所示的方式調用fclose()函數
fclose($fp);
如果該文件成功地關閉,函數將返回一個null值。反之,該函數將返回false。通常,關閉文件的操作並不像打開文件容易出錯,所以這個示例中並沒有對該操作進行測試
·讀文件
//以只讀模式打開文件:fopen()
$fp = fopen("$document_root/../orders/orders.txt",'rb');
flock($fp,LOCK_SH) // lock file for reading
//feof($fp) 知道何時讀完文件,feof()的唯一參數是文件指針。如果文件指針指向了文件末尾,它將返回true
while(!feof($fp)){
$order = fgets($fp); // 從文件中每次讀取一行內容。
echo "$order<br />";
}
flock($fp,LOCK_UN); // release read lock
fclose($fp);

·每次讀取一行數據
·fgets() //每次讀取一行內容。這樣,它將不斷地讀入數據,直至讀到一個換行字符 (\n),或者文件結束符EOF
·fgetss() //fgets()的一個變體
原型:string fgetss(resource fp[, int length[,string allowable_tags]]);
與fgets()非常相似,但是它可以過濾字符串中包含的PHP和HTML標記。如果需要保留任何特殊的標記,可以將它們包含在allowable_tags字符串中
出於安全考慮可以使用fgetss()函數
·讀取整個文件
·readfile()
//你幾乎可以使用下述語句代替前面所編寫的所有腳本
readfile("$document_root/../orders/orders.txt")
//執行流程:打開這個文件,並將文件內容輸出到標准輸出(瀏覽器中),然后再關閉這個文件,原型如下:
int readfile(string filename ,[bool use_include_path[,resource content]]);
//返回值是從文件中讀取的字節數
·file_get_contents()
//該函數與readfile()相同,但是該函數將以字符串的形式返回文件內容,而不是將文件內容回顯到瀏覽器中。
·讀取任意長度
fread()
讀取一個文件的最后一種方法是使用fread() 函數從文件中讀取最大任意長度的字節
string fread(resource fp, int length);
注:本人測試,此方法不適合網絡資源(http)
·使用其他文件函數
·查看文件是否存在:file_exists()
在不打開一個文件的前提下,檢查一個文件是否存在
file_exists("demo.php");
·確定文件大小:filesize()
它以字節為單位返回一個文件的大小,結合 fread()函數,可以使用它們一次讀取整個文件(或者文件的某部分)
filesize("demo.php");
·刪除一個文件unlink()
unlink("demo.php");
如果無法刪除這個文件,該函數將返回false。通常原因是對該文件的訪問權限不夠或者該文件不存在
·文件鎖定
為了解決並發問題,建議使用文件鎖定。在PHP中,文件鎖定是通過flock()函數來實現的。當一個文件被打開並且在進行讀寫操作之前,應該調用這個函數。原型:
bool flock ( resource fp , int operation [, int &wouldblock);
還必須將一個指向被打開的文件的指針和一個表示鎖定類型的常數作為參數傳遞給這個函數。如果鎖定成功,則返回true。如果獲得文件鎖將導致當前的進程被阻塞(也就是,不得不等待)
操作值:
LOCK_SH --- 讀操作鎖定。意味着文件可以共享,其他人可以讀該文件
LOCK_EX --- 寫操作鎖定。這是互斥的,該文件不能共享
LOCK_UN --- 釋放已有的鎖定
LOCK_NB --- 方式在請求加鎖時發生阻塞(windows不支持)
聯想:如果有兩個腳本同時申請對一個文件加鎖,情況又會如何呢?這將導致競爭條件的問題,這兩個進程將競爭加鎖,但是無法確定哪個進程將會成功,這樣
就會導致更多的問題。使用數據庫管理系統,可以很好的解決這寫問題
·當文件變大,使用普通文件將會變得非常慢
·在一個普通文件查找特定的一個或者一組記錄將會非常困難
·處理並發訪問可能會遇到問題。如果有太多的訪問量,在能夠創建訂單之前大量的用戶就可能必須等待該文件解鎖
·在文件中文插入記錄和刪除記錄太難
·沒辦法區分不同權限的數據訪問
·最簡單的方法:
·file_get_contents
//將整個文件讀入一個字符串
//file_get_contents() 函數是用於將文件的內容讀入到一個字符串中的首選方法。如果操作系統支持,還會使用內存映射技術來增強性能。
file_get_contents(path,include_path,context,start,max_length)
·file_put_contents()
//函數把一個字符串寫入文件中。與依次調用 fopen(),fwrite() 以及 fclose() 功能一樣。
file_put_contents(file,data,mode,context)
參數data --- 可選。規定要寫入文件的數據。可以是字符串、數組或數據流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM