php 从文本文件中读取并合并重复的条目

php read from text file and combine duplicate entries

我有一小段代码,我只是在测试它,如果用户的 IP 与预定义的 IP 不匹配,则基本上会重定向用户,如果不匹配,则将该 IP 写入文本文件。

$file = fopen("ips.txt", "w");

if ($ip == "iphere") {
    echo "Welcome";
    fclose($file);
} else {
    header('Location: http://www.google.com');
    fwrite($file, "\n" . $ip);
    if ($file) {
        $array = explode("\n", fread($file, filesize("ips.txt")));
    }

    $result = print_r($array, TRUE);

    fclose($file);
}

我想要做的是将我正在写入文本文件的 IP,将它们全部放入一个数组中以查找重复项,记下重复项,过滤掉它们,然后将它们写回那个文件或另一个 txt 文件,但我卡住了,不知道从这里去哪里。

这种方法在线程和性能方面存在一些问题。如果两个人同时点击网页并写入同一个文件会怎样?另外,这个文件可以增长到无限大吗?这会很慢。您不需要手动检查所有 ip,只有一个存在。

为此使用数据库 table 可能会更好。否则,您还需要处理文件锁定。

函数的伪代码 check_ips:

Select * 来自 ips where ip =?.检查用户id

如果没有结果,请插入ip。这是未知的。 (如果需要,您还可以向 table 添加约束以防止重复的 ip)

否则ip已知

您可以在 table 中记录计数、日期、上次访问或其他统计数据作为计算摘要。

我建议您使用序列化或 json_encode 将 ip 存储在文件中,这样您就可以添加更多信息(IP 访问了多少次,上次访问等)。

我给你看一个简单的例子。

1: 创建一些用于测试的虚拟 ip。

$IPs = array(
'192.168.0.1' => array(
  'visits' => 23,
  'last'   => '2015-07-20'
),
'192.168.0.2' => array(
  'visits' => 32,
  'last'   => '2015-06-23'
)
);

所以在这里我们创建了一个包含 2 个 IP 地址的关联数组,其中还包含访问次数和上次访问。

使用php序列化函数或json_encode保存文件(我更喜欢json格式,因为它可以被其他语言使用)。

$for_save = json_encode($IPs); // OR serialize($IPs)
file_put_contents("FILE_NAME",$for_save); //Save the file with the IP's

现在是阅读文件的时候了

$file = fopen("FILE_NAME", "w");
$file = json_decode($file) // or unserialize($file);

现在我们有了想要使用的数组,我们可以使用 php 数组函数搜索 ip,当然还可以修改有关 ips 的信息:

if(array_key_exists("YOUR_IP_HERE",$file)){
 //What to do if we have found the ip in the file, for example : 
   $file['YOUR_IP']['visits']++; //we add +1 visit for that ip
}

现在我们可以再次保存文件了

$file = json_encode($file);
file_put_contents("IP_FILE_NAME",$file);

您可以使用数组中的 ip 轻松读取文件,并像这样从数组中获取 unique

$ipList = file(ips.txt);

$ipUnique = array_unique($ipList);

然后你可以为你的海豚保存或解析 $ipUnique。