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


Overwriting Text in a File When It's Already Open

我有一个要打开的文件,像这样:

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的大字符串。我想要的是让文件只填充我留下的最后一个id。

我意识到我可以将write放在循环之外,但是脚本是不稳定的,很可能会因错误而过早终止,所以我希望对最后一个$beerId变量有一个引用,即使在错误的情况下,在正确终止循环之前终止脚本。

您必须回到文件的开头,因为fwrite会跟踪它在文件中的位置。使用fseek。在循环中多次打开和关闭文件是非常昂贵的,在这种情况下我没有看到这样做的理由。当你用完文件后,你当然应该关闭它。

您应该在写入文件之前添加以下内容:

fseek($idHandle, 0);

这将把您移到文件的开头,因为您的增量值您不必担心删除前一个值。

编辑在我上面的回答中,我假设遇到的id是递增的值,但你没有这么说,例如,如果你遇到id=10,然后遇到id=1上面仍然会导致文件中的10,要处理这个问题,只需在您使用str_pad:

编写的字符串中添加一些填充即可。
str_pad($value_to_write, 10); //or whatever value is reasonable.

如果可以的话,试试memcache->increment()

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

使用$memcache->add('beer_id', 0);将其初始化为0。然后像获取$memcache->get('beer_id')一样获取$beer_id以进行初始的完整性检查,然后获取$memcache->increment('beer_id');以获取下一个$beer_id

否则,坚持file_get_contents()file_put_contents():

  • http://php.net/manual/en/function.file-get-contents.php
  • http://php.net/manual/en/function.file-put-contents.php