我有一个我正在写作的文件,如下:
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变量,即使出现错误在循环正确终止之前终止脚本。
答案 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()
: