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); } ?>
代码说明
json_decode(..., true)将JSON对象转为关联数组,方便用array_column()快速提取IP列表array_column($old_records, 'IP')会从所有旧记录中提取出IP字段的值,生成纯IP数组- 额外增加
isset($_GET['ccode'])判断,避免缺少国家代码时写入异常 - 保留
LOCK_EX参数,防止多请求同时写入文件导致数据错乱
内容的提问来源于stack exchange,提问作者Zahid Hossen
相关产品推荐
相关产品推荐

