2016-06-08 104 views
0

我想要一個簡單的算法,它說:PHP塊文件讀取

文件1:(lock.php)

  • 打開一個文件
  • 鎖定文件,所以沒有其他PHP文件可以讀取該
  • 睡眠
  • 釋放鎖定

文件2: (lockstatus.php)

  • 嘗試打開文件。
  • 如果不開放
    • 等待鎖釋放
  • 否則
    • 讀取文件

我的代碼實現:

Lock.php

<?php 
$f = fopen("key",'a'); 
if (flock($f, LOCK_EX | LOCK_NB)) { 
    echo "File Locked. For Next 60 Seconds\n"; 
    sleep(60); 
    var_dump(flock($f, LOCK_UN)); //release lock 
    echo "lock released"; 
} else { 
    echo "blocked"; 
} 
?> 

Lockstatus.php

<?php 
do { 
    echo "\n"; 
    $f = fopen("key",'a'); 
    if ($f) { 
     echo "Readable\n"; 
     fclose ($f); 
    } else { 
     echo "Blocked! I am waiting\n"; 
     sleep(10); 
    } 
} while (!$f); //wait until fopen does not work 
?> 

問題: 甚至,flock應用,該Lockstatus.php能夠打開該文件。

問:

如何阻止該文件一旦被Lock.php鎖定在Lockstatus.php讀書?

回答

2

問題是flock()只提供諮詢鎖定。另一個程序可能會完全忽略這一點,然後繼續打開,fread或其他任何東西。關鍵是在你的Lockstatus中使用flock。php以及在你做完fopen之後檢查是否有鎖。 Lockstatus.php中的flock會失敗,然後您會知道存在一個現有的鎖。

1

這個函數flock()在linux和windows上有不同的行爲。

深入研究PHP文檔的「註釋」。這可能是你的問題。

flock on PHP Docs

之後,注意在R +參數,it's強制閱讀+鎖定。

$fp = fopen('/tmp/lock.txt', 'r+'); 

它不會與一個工作。

+0

我正在使用Linux。因此,我想它應該適用於我的情況。然後使它成爲'r +',但它不起作用。 –

+0

看看文檔的第一條評論:「flock函數遵循Unix系統調用的語義,它們使用相同的名稱,Flock僅使用ADVISORY鎖;也就是說,其他進程可能完全忽略該鎖;它隻影響那些召喚羊羣呼叫。「 –