当用户在我的网站上注册一个帐户时,他们自己的页面被创建,称为 USERNAME.php。
每当用户名“bob”登录时,就会在 bob.php 中添加一个新行,其中包含该登录的时间、日期和 IP 地址。
我想要做的是该文件中最多有 20 行,这样文件就不会随着时间的推移变得太大。
我的第一行是“ bob的登录检索”,然后是底部的最新登录结果。所以第一行不应该被删除,但是第二行应该在每次登录时被删除(只有当行数大于 20 时)。这样做的最佳方法是什么?谢谢!
问问题
350 次
2 回答
0
我假设.php
未使用扩展名,并且该文件最多有二十行。
您可以使用该file()
函数按行展开文件,shift
取出第一行以保存它,然后使用array_splice()
提取最后 19 行,unshift
将第一行返回到新数组中以获得最多 20 个条目。join
它们并将它们重写回原始文件。
更好的是,将它们写入一个新文件,然后如果一切顺利,将新文件重命名为新文件。
/**
* @param $file the input file
* @param $n total number of meaningful lines to keep (default 20)
* @param $m prefix lines to keep (default 1)
*
* @return number of lines in case something was done
* 0 nothing to do
* -1 file not found
* -2 file not readable
* -3 file not writeable
* -4 write error
* -8 bad parameter
*/
function trim_file($file, $n = 20, $m = 1)
{
if (!file_exists($file))
return -1;
if (!is_readable($file))
return -2;
if (!is_writeable($file))
return -3;
if ($m > $n)
return -8;
$lines = file($file);
$num = count($lines);
// If file is short, no need to do anything
if ($num <= $n)
return 0;
$header = array_slice($lines, 0, $m);
// Remove lines from 0 to ($num-($n-$m))
// and replace them with the first $m lines
array_splice($lines, 0, $num-($n-$m), $header);
// Write file with new contents
$fp = fopen($file . '.tmp', 'w');
if (!$fp)
return -4;
fwrite($fp, join('', $lines));
fclose($fp);
// Replace the file in one fell swoop.
rename($file . '.tmp', $file);
return count($lines);
}
于 2013-04-02T21:00:46.577 回答
0
如果只有20行。将文件读取到数组并以这种方式操作会很容易。可以轻松取消设置数组元素并将总数保持在 20。然后将新信息写回文件
于 2013-04-02T21:02:10.823 回答