You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现IP存在性检查,避免重复写入JSON日志文件

解决IP重复写入问题的实现方法

核心逻辑是先检查待添加的IP是否已存在于log.json中,仅当不存在时才执行追加操作,具体修改步骤如下:

关键修改点

  • 读取旧数据后,提取所有已存在的IP到单独数组
  • 使用in_array()函数判断新IP是否在现有列表内
  • 仅当IP不存在时,才将新记录加入并保存

修改后的完整代码

<?php
$file_name = 'log.json';

// 确保必要参数存在再处理
if( isset($_GET['ip']) && isset($_GET['ccode']) ) {
    $new_ip_record = array(
        'Country' => $_GET['ccode'],
        'IP' => $_GET['ip']
    );
    
    $data_to_save = [];
    if(filesize($file_name) == 0){
        // 文件为空,直接写入第一条记录
        $data_to_save = array($new_ip_record);
    }else{
        // 读取现有数据并转为关联数组
        $old_records = json_decode(file_get_contents($file_name), true);
        // 提取所有已存在的IP
        $existing_ips = array_column($old_records, 'IP');
        // 检查新IP是否未被记录
        if( !in_array($new_ip_record['IP'], $existing_ips) ){
            array_push($old_records, $new_ip_record);
            $data_to_save = $old_records;
        }else{
            // IP已存在,直接复用旧数据
            $data_to_save = $old_records;
        }
    }
    // 写入文件(LOCK_EX确保多请求时不会冲突)
    file_put_contents($file_name, json_encode($data_to_save, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), LOCK_EX);
}
?>

代码说明

  1. json_decode(..., true)将JSON对象转为关联数组,方便用array_column()快速提取IP列表
  2. array_column($old_records, 'IP')会从所有旧记录中提取出IP字段的值,生成纯IP数组
  3. 额外增加isset($_GET['ccode'])判断,避免缺少国家代码时写入异常
  4. 保留LOCK_EX参数,防止多请求同时写入文件导致数据错乱

内容的提问来源于stack exchange,提问作者Zahid Hossen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:36:41