2013-05-02 61 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' 的内容的文件