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 变量在循环正确终止之前。

4

2 回答 2

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.
于 2013-05-02T14:48:07.317 回答
1

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

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

用于$memcache->add('beer_id', 0);将其初始化为零。然后 fetch $beer_idlike$memcache->get('beer_id')进行初始健全性检查,然后$memcache->increment('beer_id');进行下一个$beer_id.

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

于 2013-05-02T14:55:58.723 回答