面試題之----寫個函式來解決多執行緒同時讀寫一個檔案的問題
阿新 • • 發佈:2019-01-07
一般的方案:
//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,如果這裡時間內沒有獲得鎖,就反覆獲得,直接獲得到對檔案操作權為止,當然。如果超時限制已到,就必需馬上退出,讓出鎖讓其它程序來進行操作。