ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
最近在优化博客呀, 想做一个统计网站 pv uv 的功能, 虽然有第三的统计平台再用, 但还是想自己写一个啊。 其实统计的数据非常简单, 就是网站的访问量丶访客量。 ``` public function __construct() { Funcs::setUV(); DB::table('visiter') - > where('id', 1) - > increment('pv'); } ``` 我还特意设计了两张简单的表来记录数据。 记录访客 ``` SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --Table structure for my_uvs -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- DROP TABLE IF EXISTS `my_uvs`; CREATE TABLE `my_uvs`( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `last_time` int(10) NULL DEFAULT NULL, PRIMARY KEY(`id`) USING BTREE ) ENGINE = MyISAM AUTO_INCREMENT = 34 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 记录 pv uv SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --Table structure for my_visiter -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- DROP TABLE IF EXISTS `my_visiter`; CREATE TABLE `my_visiter`( `id` int(10) NOT NULL DEFAULT 0, `pv` int(10) NULL DEFAULT NULL, `uv` int(10) NULL DEFAULT NULL, PRIMARY KEY(`id`) USING BTREE ) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Fixed; SET FOREIGN_KEY_CHECKS = 1; ``` 访问量 初始化 visiter 表, 新增一个就行。 页面每访问一次, 就自增 1. DB::table('visiter') - > where('id', 1) - > increment('pv'); 访客量 访客量我是以 ip 记录的, 每个 ip 在 24 小时内访问只记录一次, 所有才有了 last_time 字段, 用访问时间做对比就行了。 ``` public static function setUV() { $ip = request() - > ip(); $uv = DB::table('uvs') - > where('ip', $ip) - > first('*'); $uv = self::toArray($uv); if ($uv === null) { DB::table('uvs') - > insert(['ip' => $ip, 'last_time' => time()]); DB::table('visiter') - > where('id', 1) - > increment('uv'); return true; } if ($uv['last_time'] + 86400 < time()) { DB::table('uvs') - > where('ip', $uv['ip']) - > update(['last_time' => time()]); DB::table('visiter') - > where('id', 1) - > increment('uv'); return true; } return 0; } ``` 总结 可能这种方法统计的很不全面, 但是在设计方面还算是比较合理的。 这种统计代码放在中间件里实现更精简更合理。 以 ip 来记录访客量, 到后面数据肯定会比较大, 这到时候用 artisan 计划任务清理就行。