2013-03-13 53 views
0

我想知道下面的代碼是否正確寫入。我試圖編寫一個安全的關鍵部分,寫在一個文件內部,並試圖預測任何可能出錯的事情。PHP。安全地寫入文件

有什麼我應該在瞭望臺上?我的意思是,我寫了try-catch語句,以防萬一在羣中出現錯誤,所以它設法關閉文件並釋放鎖。還有什麼應該謹慎的?

任何想法?

 /* 
     * Write to file 
     */ 
     if (file_exists($sPath)) 
     { 
      //CRITICAL PART (start) 
      $oFile = fopen($sPath, "a"); 

      //If could not open file then just return 
      if ($oFile == false) return; 

      try{ 
       //Acquire lock 
       if (flock($oFile, LOCK_EX)) 
       { 
        //Append a new line 
        fwrite($oFile, "\n"."sometext"); 
       } 
      }catch(Exception $e){ 
       //Release lock before exiting 
       fclose($oFile); 
       return; 
      } 
      //Release lock 
      fclose($oFile); 
      //CRITICAL PART (end) 
     } 
+1

無論['羊羣'](http://php.net/flock)和['fwrite'](http://php.net/fwrite)不要拋出任何異常,因此try/catch塊對我來說沒有任何意義。 – hakre 2013-03-13 08:46:40

+0

哦......你是對的。好的觀察結果,謝謝。 – AndreiBogdan 2013-03-13 08:47:57

+0

如果你問一個關於具體問題的具體編程問題,另外Stackoverflow的效果最好。問題如*「我有什麼需要了解的?」* +這裏是我的代碼在Q&A格式中效果不好。 – hakre 2013-03-13 08:49:27

回答

1

PHP函數不拋出異常(至少絕大多數OOP本地代碼不做......新功能做拋出異常,你知道DateTime和...) ,所以你的try/catch在那裏沒用。您需要檢查所有功能的返回值,並檢查它是不是false。除此之外,我認爲你管理得很好。作爲一個方面說明,文件鎖定是在linux(我不知道在其他平臺)諮詢,所以你沒有獲得一個真正的鎖在文件上。我的意思是,其他進程可能會修改/覆蓋/刪除您「鎖定」的文件。

+0

錯誤。這絕不是一個永遠不會在PHP中。即使這是常見的,IIRC也有這個規則的例外。 – hakre 2013-03-13 08:49:43

+0

@hakre喲意味着什麼規則? – 2013-03-13 08:50:35

+0

您制定核心功能的「規則」決不會拋出異常。 – hakre 2013-03-13 08:51:39

2
file_put_contents($sPath,"\n"."sometext", FILE_APPEND); 

我相信鎖定不需要追加。文件系統將處理它。
不過,我可能是錯的

+0

大多數文件系統都支持除NFS之外的原子追加,而'flock()'也應該支持。 – 2013-03-13 09:19:01

1

由於fopen函數成功返回文件指針資源,或FALSE上的錯誤,你可以使用三聯比較===,即:

if ($oFile === false) return;