我有一个脚本,用于计算我从互联网上下载的文件的下载次数。基本上它有一个日志文件,每次下载文件时都会添加一行文本。
我想略微修改它,以便第一行是一个数字,每次下载一个文件时,它会将该数字增加一个(因此很容易看出有多少人下载了它。)
这是我现在的代码(这不起作用):
$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部分工作得很好......这是上面那部分不能正常工作的部分。
谢谢!
答案 0 :(得分:2)
file_get_contents()
将ENTIRE文件吸收到字符串中。然后尝试对此字符串执行fgets(),这是不正确的 - fgets()适用于文件句柄,而不是字符串。
如果您没有使用@
(从不一个好主意)来抑制错误,那么您很可能已经看到PHP警告过您。 从不会产生错误,特别是在开发过程中。这就像是在体育运动,并说“如果我摔断了腿我会在乎谁,我现在要去参加这场马拉松比赛”./。
我强烈建议您使用数据库进行此类操作。一个简单的
UPDATE downloads SET total = total + 1 WHERE file_id = XXX
比执行这些文件操作更安全。特别是如果日志文件变大。你要将一个完整的多兆字节文件吸入内存,读取一个值,然后将其全部丢弃。然后再次打开并重写文件。如果两个或多个下载同时完成,那么您将使用冲突的读/写来删除日志文件。
如果您坚持基于文件的操作,那么在脚本执行更新时,请使用flock()
限制其他并行下载的访问。