当文件已经打开时覆盖文件中的文本

时间:2013-05-02 14:41:28

标签: php

我有一个我正在写作的文件,如下:

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++;

然而,这最终会在我遇到的每一个啤酒中形成一大串。我想要的是仅使用我上次使用的最后一个ID填充文件。

我意识到我可以将写入放在循环之外,但是脚本是易失性的并且可能会因错误而过早终止,所以我想要引用最后的$ beerId变量,即使出现错误在循环正确终止之前终止脚本。

3 个答案:

答案 0 :(得分: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 :(得分: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.

答案 2 :(得分:1)

如果可以,请尝试memcache-> increment()。

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()