html - php文章浏览量用什么做好呢
天蓬老师
天蓬老师 2017-04-11 10:12:46
[PHP讨论组]

文章浏览量用什么做好呢,网上找了些方法感觉都不太好,按session,按cookie,按点击次数都有,想问问大神们怎么设计更合理,用的php

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(6)
巴扎黑

浏览量最普遍的计算方式就是文章的打开次数,基本上涉及到浏览量的文章刷新页面浏览量就会增加1

ringa_lee

如果对数据要求不高,那就cookie 同一个浏览器算1次,然后数据存储到redis

PHP中文网

刷新一次更新一次很容易被恶意刷量,数据库也容易被攻击.
可以考虑同一个IP在一段时间内(比如一天)的访问只算一次.
也就是更新文章阅读次数前,先查找当前用户IP是否在1天内访问过.
如果没有,则执行UPDATE更新阅读数加1,并且INSERT插入一条"文章ID+IP+时间"记录.
写的时候可以先写到Redis中,然后每隔一段时间后获取互斥锁写入MySQL.
$redis->set('post_views_1024', $redis->get('post_views_1024')+1);
如果文章阅读次数最后更新时间超过600秒,则写入MySQL:

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);
        }
    }
}
PHP中文网

文章ID 为key
比如$key = article:1
然后写入redis
定期跑脚本 落地到mysql

高洛峰

谢谢大家的热心回答!

高洛峰

可以考虑用脚步解析ngnix或httpd的日志文件

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号