Done
<?php
define('FILE_NAME', 'list.dat');
define('MAX_BREAK', 30);
function write($file, $ip, $time)
{
fwrite($file, $ip . '|' . $time . "\n");
}
$new_ip = /*$REMOTE_ADDR*/ $_SERVER['REMOTE_ADDR'];
$file = fopen(FILE_NAME, 'w+');
flock($file, LOCK_EX | LOCK_SH);
$array = file(FILE_NAME, FILE_IGNORE_NEW_LINES);
$contains = false;
foreach ($array as $record)
{
$values = explode('|', $record);
$ip = $values[0];
$time = $values[1];
if ($ip == $new_ip)
{
$time = time();
$contains = true;
}
if (time() - $time < MAX_BREAK)
write($file, $ip, $time);
}
if (!$contains)
write($file, $new_ip, time());
flock($file, LOCK_UN);
fclose($file);
?>
$ array为空,但不应该因为文件包含一行。 有什么想法吗?
答案 0 :(得分:2)
因为list.dat
为空。
fopen with w+
'w +'开放阅读和写作;将文件指针放在文件的开头,并将文件截断为零长度。如果该文件不存在,请尝试创建它。
答案 1 :(得分:1)
如果file命令返回false,则表示file()失败。我认为它可能会失败,因为你已经将它与你的flock()调用锁定了。 file()函数不需要以fopen()开头。
答案 2 :(得分:1)
使用flock()
获取文件的独占锁定,之后您想要阅读它。这不起作用。共享锁可能就足够了(没有人可以在锁定时更改文件)。
flock($file, LOCK_EX | LOCK_SH);
变为
flock($file, LOCK_SH);