2014-05-11 47 views
0

寫我有一些問題的fopen的fopen和文件

的第一個問題,當我去添加新條目始終把對文件的末尾並沒有啓動文件,例如,它是:

$fp=fopen("text.dat","a"); 
fputs($fp,"Hello 1"."\n"); 
fclose($fp); 

始終將導致該文件顯示到最後:

Hello 1 
Hello 2 
Hello 3 

而且沒有,因爲我想,插入到作秀首位以此爲新評論:

Hello 3 
Hello 2 
Hello 1 (The most old entry) 

另一方面,我的第二個問題,例如,如果我有10個用戶,並且這10個用戶同時在這個文本文件中插入一個條目或帖子,這是可能的還是可以給我一些錯誤?或者我需要使用羣集,直到保存每個帖子,當某些用戶想要在文件中同時更改某些內容時,這是最好的方法,以避免給我帶來麻煩。

回答

1

有沒有辦法自動預先考慮文件。因此,最好將現有內容存儲在臨時文件中,然後將其插入文件中。

$fp=fopen("text.dat","w"); 
fwrite($fp,"Hello 1"."\n".fread($fp)); 
fclose($fp); 

這將被輸出爲:

Hello 3 
Hello 2 
Hello 1 

但是就鎖被認爲是,我不認爲這是可能的,還是我不回答這個合適的人。

0
  1. 當您寫入文件時,它總是會在最後附加。有沒有變通辦法,這我知道,但爲了實現你想要的(這是顯示以相反的順序行)可以讀取行到一個數組中,並顯示以相反的順序排列。
  2. 至於鎖定,只有一個進程可以持有鎖到一個文件,所以你真的沒有做任何事情因爲如果兩個用戶試圖在同一時間更新同一文件 - 其中只有一個會成功 - 這實際上會產生一個不同的問題(其中一個用戶將失去她的職位)。爲了解決這個問題,在保存用戶的編輯之前,您應該向用戶發送帖子的原始副本和用戶提交的新版本 - 檢查是否更新了原始版本。如果它不是最新的,這意味着另一個用戶在同一時間改變了它。 「用戶友好」的行爲是向用戶返回一個錯誤,說他的版本不是最新的,但也包括他的編輯 - 這樣他就不必從頭開始重新編寫所有的東西。
0

對於您需要數據庫,這更適合於多用戶的東西和整理,

或者使用一個子目錄,並在其自己的文件創建的每一個消息,有做了一個文件名可以排序的時間戳:yyyymmddhhmmss。但是,你需要防止目錄緩存。

由於每個人都有權力固執/削減優勢:請參閱file_get_contents加載所有內容,並file_put_contents