一般的方案:
//fopen():打開文件或者 URL,返回resource類型數據 。 $fp = fopen('./tmp/lock.txt', 'a+'); if (flock($fp, LOCK_EX)) {//取得獨占鎖定 fwrite($fp, "Write something here\n"); flock($fp, LOCK_UN);// 釋放鎖定 } else { echo "Couldn't lock the file !"; } fclose($fp);
但在PHP中,flock似乎工作的不是那么好!在多並發情況下,似乎是經常獨占資源,不即時釋放,或者是根本不釋放,造成死鎖,從而使服務器的cpu占用很高,甚至有時候會讓服務器徹底死掉。
方案二:對文件進行加鎖時,設置一個超時時間.
$fileName = './tmp/lock.txt'; if ($fp = fopen($fileName, 'a+')) { $startTime = microtime(); while ((microtime() - $startTime) < 1000) { $canWrite = flock($fp, LOCK_EX); if (!$canWrite) { usleep(round(rand(0, 100) * 1000)); } else { fwrite($fp, "Write something here\n"); break; } } fclose($fp); }
超時設置為1ms,如果這里時間內沒有獲得鎖,就反復獲得,直接獲得到對文件操作權為止,當然。如果超時限制已到,就必需馬上退出,讓出鎖讓其它進程來進行操作。