1. 程式人生 > >面試題之----寫個函式來解決多執行緒同時讀寫一個檔案的問題

面試題之----寫個函式來解決多執行緒同時讀寫一個檔案的問題

一般的方案:

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