我有一个要打开的文件,像这样:
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