2013-05-02 106 views
0

我有我打開用於寫入的文件,如:覆寫文本當它已經打開

if (!$idHandle = fopen($fileName, 'w')) { 
     echo "Cannot open file ($fileName)"; 
     die(); 
    } 

我然後進入一個循環,我增加一個變量,$beerId,在每次迭代。我想保存該變量我已打開的文件,所以我用下面的代碼:

if (fwrite($idHandle, $beerId) === FALSE) { 
    echo "Cannot write to file ($fileName)"; 
    die(); 
    } 
$beerId++; 

然而,這最終建立每beerId我遇到的一個巨大的字符串。我想要的是隻用最後一個ID填充文件。

我意識到我可以把寫操作放在循環之外,但腳本是不穩定的,可能會因爲錯誤而過早終止,所以我想要引用最後一個$ beerId變量,即使出現錯誤在循環正確結束之前終止腳本。

+0

使用FCLOSE關閉文件的文件被刪除,所以打開你的文件,爲每個循環打開,寫入,關閉 – Nagasaki 2013-05-02 14:46:47

+0

。 – Ogelami 2013-05-02 14:47:19

+0

這就是我所害怕的。我希望避免在循環中打開和關閉潛在的數千次。我意識到一個小文本文件的開銷很小,但我一直在尋找更清晰的解決方案。 – user1427661 2013-05-02 14:48:18

回答

1

您必須回到文件的開頭,因爲fwrite會跟蹤它在文件中的位置。使用fseek。在一個循環中多次打開和關閉文件是昂貴的,在這種情況下我沒有看到這樣做的理由。當你完成它時,你當然應該關閉文件。

你應該只是你寫入文件之前補充一點:

fseek($idHandle, 0); 

這將您移動到文件的開頭,因爲你的遞增值,您將不必擔心刪除以前的值。

編輯 在回答上述假設我的id遇到遞增值,但你不說的話,例如,如果你遇到id=10,然後遇到id=1 上面仍然會導致10在文件中,以處理只需添加一些填充到您使用str_pad寫入字符串:

str_pad($value_to_write, 10); //or whatever value is reasonable. 
1

你在做什麼看起來像矯枉過正,在那裏你只能寫一個值到文件中。我的第一個建議是隻使用APC並將其寫入緩存。由於該文件是「易失性」,因此使用緩存會更可取,因此您不必執行任何文件管理。

除此之外,你應該寫這樣的文件:file_put_contents($fileName,$beerid);。它不需要獨佔鎖定,並會自動覆蓋文件中的數據。如果你想從該文件中的數據,你只需要使用$beerid = file_get_contents($fileName);

全碼

// Set the file path and get the beerid within 
$file = '/pathtobeer/beerid.txt'; 
$beerid = file_get_contents($file); 

// Increment as needed 
$beerid++; 

// Write the $beerid to the file 
file_put_contents($file,$beerid); 

// Add error checking as necessary. 
1

如果可以,儘量memcache->增量()。

http://php.net/manual/en/memcache.increment.php

使用$memcache->add('beer_id', 0);將其初始化爲零。然後取$beer_id,如$memcache->get('beer_id')進行初始健全性檢查,然後$memcache->increment('beer_id');爲下一個$beer_id

否則,堅持file_get_contents()file_put_contents():根據的fopen文件,當您打開與 'W' 的內容的文件

相關問題