一个简单的每日访客IP统计

<?php
date_default_timezone_set('PRC');
$path='/home/vcap/app/data/7a08c90b-6f63-481f-8f21-b168467261e9';
$date=date('Ymd');
$save=$path.'/save';if(!file_exists($save)){mkdir($save,0777,true);}
$temp=$path.'/temp';if(!file_exists($temp.'/'.$date)){mkdir($temp.'/'.$date,0777,true);}
$addr=$temp.'/'.$date.'/'.md5('&7*ERGS&*hfd$^UR57DG'.$_SERVER['REMOTE_ADDR']);if(!file_exists($save.'/'.$date)){fopen($save.'/'.$date,'w');}
$read=file_get_contents($save.'/'.$date);foreach(array_diff(scandir($temp),array('.','..',$date)) as $sbv){foreach(array_diff(scandir($temp.'/'.$sbv),array('.','..')) as $sbw){unlink($temp.'/'.$sbv.'/'.$sbw);}rmdir($temp.'/'.$sbv);}
if(!file_exists($addr)){file_put_contents($save.'/'.$date,$read+1,LOCK_EX);fopen($addr,'w');}
header('Content-type:text/javascript');echo 'console.log("DailyIP:'.$read.'")';

最近好友委托写一个独立的每日访问IP统计程序,然后就攒了攒之前代码整出这么一团来。主要流程就是:记录每日的访客IP,并写入计数文件,第二天清理之前的。

遇到的主要问题是文件写入冲突,我试了下之前即便用LOCK_EX写入,在访问频繁时一样会造成计数文件被覆盖。后来研究了一下发现问题,应该是和之前的file_get_contents冲突了。之前设定的是如果没有检测到文件就赋值0,但貌似LOCK_EX写入时也是没有文件状态,所以另一个进程的file_get_contents被赋值了0。

改成了现在这样,用fopen创建不存在文件,初步测试没有冲突了。

使用JSP制作一个简易的访客计数器,可以通过以下步骤来实现: 1. 创建一个文本文件,用来存储访客的数量,例如命名为`visitor_count.txt`。 2. 在JSP页面中,首先检查该文件是否存在。如果存在,则读取文件中的内容,获取当前的访客数,并将其转换为整数。 3. 将当前的访客数加1,然后将新的访客数写回到文件中。 4. 显示当前的访客数在JSP页面上。 以下是一个简单的代码示例: ```jsp <%@ page import="java.io.*" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>简易访客计数器</title> </head> <body> <% // 访客计数器文件路径 String filePath = "visitor_count.txt"; int visitorCount = 0; // 读取访客数 try { // 检查文件是否存在 File file = new File(filePath); if (file.exists()) { FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); visitorCount = Integer.parseInt(bufferedReader.readLine()); bufferedReader.close(); fileReader.close(); } // 访客数加1 visitorCount++; // 将新的访客数写回文件 FileWriter fileWriter = new FileWriter(file); PrintWriter printWriter = new PrintWriter(fileWriter); printWriter.println(visitorCount); printWriter.close(); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } // 显示访客数 %> <p>您是第<%= visitorCount %>位访问者。</p> </body> </html> ``` 在上述代码中,我们首先导入了必要的Java I/O类,然后通过JSP脚本段读取、修改和写入文件来更新和显示访问者计数。 需要注意的是,这种方法在高并发的情况下可能会有数据不一致的问题,因为多个用户同时访问时可能会同时读取、修改和保存文件。为了提高计数器的准确性和性能,实际生产环境中建议使用数据库或其他持久化存储方式来实现计数器功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值