面試題之----寫個函數來解決多線程同時讀寫一個文件的問題


一般的方案:

//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,如果這里時間內沒有獲得鎖,就反復獲得,直接獲得到對文件操作權為止,當然。如果超時限制已到,就必需馬上退出,讓出鎖讓其它進程來進行操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM