扫码关注官方订阅号
文章浏览量用什么做好呢,网上找了些方法感觉都不太好,按session,按cookie,按点击次数都有,想问问大神们怎么设计更合理,用的php
欢迎选择我的课程,让我们一起见证您的进步~~
浏览量最普遍的计算方式就是文章的打开次数,基本上涉及到浏览量的文章刷新页面浏览量就会增加1
如果对数据要求不高,那就cookie 同一个浏览器算1次,然后数据存储到redis
刷新一次更新一次很容易被恶意刷量,数据库也容易被攻击.可以考虑同一个IP在一段时间内(比如一天)的访问只算一次.也就是更新文章阅读次数前,先查找当前用户IP是否在1天内访问过.如果没有,则执行UPDATE更新阅读数加1,并且INSERT插入一条"文章ID+IP+时间"记录.写的时候可以先写到Redis中,然后每隔一段时间后获取互斥锁写入MySQL.$redis->set('post_views_1024', $redis->get('post_views_1024')+1);如果文章阅读次数最后更新时间超过600秒,则写入MySQL:
$redis->set('post_views_1024', $redis->get('post_views_1024')+1);
if( (time()-600) > $redis->get('post_views_last_update_time_1024') ) { $key = 'lock'; //锁 $random = md5( uniqid(getmypid().'_'.mt_rand().'_', true) ); //随机值 $ttl = 10; //nx表示not exists.ex表示expire.ttl表示超时时间time to live,单位是秒. if( $redis->set($key, $random, ['nx', 'ex' => $ttl]) ) { //加锁 //写入MySQL $mysqli->query('UPDATE posts SET views = '.$redis->get('post_views_1024').' WHERE id = 1024'); if( $mysqli->affected_rows === 1 ) { $redis->set('post_views_last_update_time_1024', time()); } //加入随机值判断是为了避免删除到其他操作的锁 if($redis->get($key) == $random) { $redis->del($key); } } }
文章ID 为key比如$key = article:1然后写入redis定期跑脚本 落地到mysql
谢谢大家的热心回答!
可以考虑用脚步解析ngnix或httpd的日志文件
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
浏览量最普遍的计算方式就是文章的打开次数,基本上涉及到浏览量的文章刷新页面浏览量就会增加1
如果对数据要求不高,那就cookie 同一个浏览器算1次,然后数据存储到redis
刷新一次更新一次很容易被恶意刷量,数据库也容易被攻击.
可以考虑同一个IP在一段时间内(比如一天)的访问只算一次.
也就是更新文章阅读次数前,先查找当前用户IP是否在1天内访问过.
如果没有,则执行UPDATE更新阅读数加1,并且INSERT插入一条"文章ID+IP+时间"记录.
写的时候可以先写到Redis中,然后每隔一段时间后获取互斥锁写入MySQL.
$redis->set('post_views_1024', $redis->get('post_views_1024')+1);如果文章阅读次数最后更新时间超过600秒,则写入MySQL:
文章ID 为key
比如$key = article:1
然后写入redis
定期跑脚本 落地到mysql
谢谢大家的热心回答!
可以考虑用脚步解析ngnix或httpd的日志文件