請寫一段 PHP 代碼,確保多個進程同時寫入同一個文件成功

編程語言 PHP Flock Windows 達人科技 2017-03-31

考點:對函數的理解

fopen :打開文件或者URL

參數1:文件地址或者URL
參數2:mode 參數指定了所要求到該流的訪問類型
    'r'只讀方式打開,將文件指針指向文件頭。
    'r+'讀寫方式打開,將文件指針指向文件頭。
    'w'寫入方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
    'w+'讀寫方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
    'a'寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
    'a+'讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。

fwrite : 寫入文件

參數1:文件名文件系統指針
參數2: 要寫入的內容 string類型
返回值: 寫入成功返回寫入的字符數,失敗返回false

flock: 輕便的諮詢文件鎖定

參數1:文件系統指針,是典型地由 fopen 創建的 resource(資源)。
參數2:模式
    LOCK_SH取得共享鎖定(讀取的程序)。
    LOCK_EX 取得獨佔鎖定(寫入的程序。
    LOCK_UN 釋放鎖定(無論共享或獨佔)。
    如果不希望 flock 在鎖定時堵塞,則是 LOCK_NB(Windows 上還不支持)。

返回值:成功時返回 TRUE, 或者在失敗時返回 FALSE。

fclose : 關閉一個打開的文件指針

參數1:文件名
參數2:成功時返回 TRUE, 或者在失敗時返回 FALSE。
function writeData($filepath, $data) 
{ 
    $fp = fopen($filepath,'a');  
    do{ 
        usleep(100); 
    }while (!flock($fp, LOCK_EX));  //LOCK_EX 取得獨佔鎖定(寫入的程序)進行排它型鎖定 獲取鎖 有鎖就寫入,沒鎖就得
    $res = fwrite($fp, $data."\n"); 
    flock($fp, LOCK_UN);    //LOCK_UN 釋放鎖定(無論共享或獨佔)。
    fclose($fp);  
    return $res; 
} 
function write_file($filename, $content)
{
    $lock = $filename . '.lck';
    $write_length = 0;
    while(true) {
        if( file_exists($lock) ) {
 usleep(100);
        } else {
 touch($lock);
 $write_length = file_put_contents($filename, $content, FILE_APPEND);
 break;
        }
    }
    if( file_exists($lock) ) {
        unlink($lock);
    }
    return $write_length;
}

相關推薦

推薦中...