2013-03-09 22 views
2

PHP允許我們使用x標誌做fopen時:PHP fopen(x標誌)保證只運行一次?

創建並以寫入方式打開;將文件指針放在文件的起始位置 處。

如果該文件已經存在,則fopen()調用 將返回FALSE和產生水平 E_WARNING的錯誤失敗。

如果文件不存在,請嘗試創建它。這是 等價於爲底層 開放(2)系統調用指定O_EXCL | O_CREAT標誌。

這是否意味着我們無論有多少個併發請求的fopen(來自不同的用戶),可以保證該文件將只創建一次,從來沒有被覆蓋?

if ($handle = fopen("part006", "x+b")) { 
    do_some_processing(); 
    echo "You managed to process."; 
    /* 

    can we guarantee that only 1 user (http request) 
    will ever process the function and see the 
    message "you managed to process" ? 

    */ 
} else { 
    echo "You failed to process."; 
} 

回答

1

答:這是保證該文件將只創建一次,從來沒有被覆蓋,只要其他進程也使用O_EXCL。如果他們不這樣做,該文件可以被覆蓋。因此,開口(創建)使用O_EXCL文件意味着不,該文件是有點寫保護

說明:FOPEN使用了底層open系統調用。從手冊頁:man 2 open

O_EXCL

如果O_CREAT和O_EXCL設置,打開()將文件是否存在故障。如果文件不存在,則檢查文件是否存在以及文件的創建對於執行open()的其他線程是原子的,這些線程在O_EXCL和O_CREAT集合的同一目錄中命名相同的文件名。如果設置了O_EXCL和O_CREAT,並且路徑名稱是符號鏈接,則無論符號鏈接的內容如何,​​open()都會失敗並將errno設置爲[EEXIST]。如果設置了O_EXCL並且未設置O_CREAT,則結果未定義。

+0

是否保證Windows獨佔性? – Pacerier 2013-03-09 04:05:18

+0

我不確定(但很有可能)..會試圖找到這些信息..(不幸的是'人'不能在Windows上工作)) – hek2mgl 2013-03-09 04:06:21

+0

@Pacerier閱讀一些郵件列表,看起來這不起作用在窗戶上。但我不確定,因爲我目前沒有測試窗口。你可以測試嗎?如果它不起作用,那麼你應該使用'flock()'來達到這個目的。這是不一樣的,但它可能會幫助你(不知道你的應用程序的需求)。注意我對這[問題]的答案(http://stackoverflow.com/questions/15305296/how-to-use-flock- in-php/15305346#15305346)這是'flock()'相關,並可能有所幫助 – hek2mgl 2013-03-09 04:14:12