使用php将文件第一行的数字增加1

时间:2011-10-13 16:52:30

标签: php

我有一个脚本,用于计算我从互联网上下载的文件的下载次数。基本上它有一个日志文件,每次下载文件时都会添加一行文本。

我想略微修改它,以便第一行是一个数字,每次下载一个文件时,它会将该数字增加一个(因此很容易看出有多少人下载了它。)

这是我现在的代码(这不起作用):

$conten = @file_get_contents(LOG_FILE);
//First line: $conten[0];

$content = fgets($conten);

$fo = @fopen(LOG_FILE, 'r+');
if ($fo) {
  $content++;
  @fputs($fo, ".$content.");
  @fclose($fo);
}


$f = @fopen(LOG_FILE, 'a+');
if ($f) {
  @fputs($f, date("m.d.Y g:ia")."  ".$_SERVER['REMOTE_ADDR']."  ".$fname."\n");
  @fclose($f);
}

$ f部分工作得很好......这是上面那部分不能正常工作的部分。

谢谢!

1 个答案:

答案 0 :(得分:2)

file_get_contents()将ENTIRE文件吸收到字符串中。然后尝试对此字符串执行fgets(),这是不正确的 - fgets()适用于文件句柄,而不是字符串。 如果您没有使用@从不一个好主意)来抑制错误,那么您很可能已经看到PHP警告过您。 从不会产生错误,特别是在开发过程中。这就像是在体育运动,并说“如果我摔断了腿我会在乎谁,我现在要去参加这场马拉松比赛”./。

我强烈建议您使用数据库进行此类操作。一个简单的

UPDATE downloads SET total = total + 1 WHERE file_id = XXX

比执行这些文件操作更安全。特别是如果日志文件变大。你要将一个完整的多兆字节文件吸入内存,读取一个值,然后将其全部丢弃。然后再次打开并重写文件。如果两个或多个下载同时完成,那么您将使用冲突的读/写来删除日志文件。

如果您坚持基于文件的操作,那么在脚本执行更新时,请使用flock()限制其他并行下载的访问。