php文件基本操作

讀寫基本操作

  • 寫文件函數: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()自動解鎖!
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容