2016-06-16 71 views
-1

我的應用程序內有一點問題。 我有很多進程自動啓動,從服務器用crontab,用php寫成文件夾內的文件讀取。多個進程讀取相同的文件php

有時不同的進程讀取相同的文件和應用程序中創建一個問題。 有沒有辦法解決這個問題? 實際上,我讀取文件夾中的所有文件,讀取它們並立即刪除,但有時另一個進程在刪除它之前讀取相同的文件。

這是我的腳本cakephp3(所以有些類,如文件只是爲cakephp3,但不是問題的問題)寫入讀取和刪除:

$xml_files = glob(TMP . 'xml/*.xml'); 
foreach($xml_files as $fileXml) 
{ 
    //read the file and put into a string or array or object 
    $explStr = explode('/', $fileXml); 
    $filename = $explStr[count($explStr) - 1]; 
    $path = TMP . '/xml/' . $filename; 
    $file = new File($path, false); 

    if($file->exists()){ 
     $string = $file->read(); 

     $file->close(); 
     $file->delete(); 
    } 
} 
+0

有趣的是,在[CakePHP的文件API](http://book.cakephp.org/3.0/en/core-libraries/file-folder.html#file-api)表明鎖定是由框架處理。 exists()條件在這裏似乎沒有用,你試過用if($ string = $ file-> read())來代替它嗎? –

+0

我已經試過了,但是沒有辦法解決這個問題@ code-kobold –

回答

2

使用flock()獲得(或試圖獲得)文件鎖並相應地採取行動。

+0

請問您可以舉一個如何在我的腳本中使用它的例子嗎? –

+1

@AlessandroMinoccheri我不能因爲你已經使用了一些「文件」類而不是經典的文件句柄。也許「File」類有一個已經內置的鎖定方法。'flock()'文檔有一些例子。 – ShiraNai7

+0

@MarcinOrlowski我見過的羊羣()的文件,但我想知道什麼是更好的方式來做到這 –

2

這就是所謂的競爭條件,並在處理文件時,當一個進程使用它,你可以鎖定文件,鎖定它,然後如果它鎖定其他進程會檢查,如果是則什麼也不做。然後在進程A完成時解鎖文件。

+0

你能舉個例子說明如何在腳本里面使用它嗎? –