开发者社区> 轩脉刃> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

如何开发打点统计系统

简介:
+关注继续查看

最近做了一个打点统计系统,统计系统肯定各个公司都有做过,至于怎么做就不好说了。我见过最多的就是使用php开发一个打点接口,然后在打点接口中做数据点击,这种方法最差的就是每次打点都往数据库中操作,另外一种就是往一个文件中增加数据。对于后一种,我就很奇怪了,你既然php是等于要往日志文件中增加一条记录,那干啥不用web服务器的自身的日志呢?所以我这次就果断使用分析nginx日志的方法来做打点(这个方法也是大多公司统计系统采用的方法吧)。
至于storm,hadoop啥的,太高大上了。没用

 

nginx日志打点第一个使用什么打点接口,当然可以自己放一个文件在服务器,然后访问这个文件。但是实际上nginx有个empty_gif的模块,它把图片存放在nginx的内存中,所以它的访问速度比静态文件的访问速度还快,所以果断选择这个。因此我的配置文件如下:

复制代码
server {
        listen       80;
        server_name ares.test.com;
        access_log /home/web/ares/log/ares.test.com.access.log;
        access_log /home/web/ares/log/ares.test.com.static.log;
        error_log /home/web/ares/log/ares.test.com.error.log notice;

        root /home/web/test/www/;
        index index.php;

        location = /ares.gif {
            empty_gif;
        }
}
复制代码

这里我把access_log写两份,目的是希望我一份做存留,一份做分析。

我设计的访问接口是http://ares.test.com/ares.gif?p=a&i=b

这里的p和i是统计的项目和统计项。

 

然后日志写完了之后,就需要进行日志切割了,日志切割怎么搞都行,我就搬起了php最快上搞,就是这里要注意下切割完日志以后要给nginx发送一个信号,让它修改下日志的fd。

复制代码
       @rename($srcLog, $disLog);

        // 发送信号给nginx
        $pidFile = Yii::app()->params->nginxPid;
        $command = "kill -USR1 `cat ${pidFile}`";

        @system($command);
复制代码

然后这个脚本我设置每1分钟跑一次,将当前的日志用分钟来重命名

 

下面就是分析日志的过程。

分析日志一定会是多个进程的环境。为什么,因为,一个进程,太慢。那多进程的环境,就需要有多个进程同时读取一个文件的情况,分析日志的时候就需要注意下使用文件锁。

复制代码
            $disLogs = glob(Yii::app()->params->logFolder . "ares_*.log");

            foreach ($disLogs as $log) {
                $fp = fopen ($log , "rw+");

                // 如果获取到锁
                if (flock($fp , LOCK_EX)) {
                    while(!feof($fp)) {
                        $line = fgets($fp, 4096);
                        // DO SOMETHING
                    }

                    ftruncate($fp, 0);
                    fflush($fp);
                    flock($fp, LOCK_UN);
                    unlink($log);

                    echo "logfile {$log} ok" . PHP_EOL;
                }

                fclose ($fp);
            }
复制代码

然后这个脚本我会让它循环跑10分钟,每2分钟启动一个脚本,这样就有5个脚本在跑。

至于数据库设计,就和后台需求有关了。

我这里第一版最简单的就是记录下每个小时的点击数。

所以只需要最简单的项目表,统计项表,统计数据表就好。

这样子还有个好处就是可分布式扩展,如果一个统计前端机扛不住了,那么我就单纯加机器就好了,反正这些数据都是往同一个数据库中插入的。

 

至于后台界面开发,最近疯狂喜欢上ACE这套后台模板,然后画图使用HighChart来弄。

后台统计项目如何加功能后面后面再说~

 

至此初步的统计就搞起来了。我在一台机器上测试过前端压力,8核的机器,大概能有1w左右的qps。至少能扛过一阵了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
小白如何学操作系统?(一)
很多读者问我如何学习操作系统?推荐几本操作系统可以看的书?操作系统都需要学什么?有哪些视频可以看吗?下面我就针对性的对这些问题做一下我自己的阐述。
49 0
小白如何学操作系统?(三)
很多读者问我如何学习操作系统?推荐几本操作系统可以看的书?操作系统都需要学什么?有哪些视频可以看吗?下面我就针对性的对这些问题做一下我自己的阐述。
33 0
电商系统的开发,有什么需要注意的?
对于很多想进入电商市场的企业来说,自行开发一个电商平台的费用是非常高的。所以,他们需要找一个成熟的商城系服务商统来帮他们搭建这个电商平台。那么,问题就来了。在这个鱼龙混杂的互联网市场里,我们要怎样选择,才能找到适合自己的电商系统开发公司呢?今天,飞进科技小编就和大家讨论一下这个话题吧。
1030 0
如何快速开发一个IM系统
本文将会给大家介绍如何开发一个简单的即时通讯系统(IM)。 # 为什么不简单 > 我们的站点加一个即时通讯(IM)的功能,那么我们怎么做? 在回家的路上,问了同是实习生(网络方向)的舍友这样一个问题,他回答:`“很简单,只需要在服务端保存一个list,收到一个人的message后,我转发给list中指定的另一个人就好啦”` 接着,我们讨论了一晚上下面的几个问题 1.
2650 0
推荐系统的一些思考
推荐系统一直以来都是电商网站必不可少的一项,在提升用户转化,增加GMV方面可谓功不可没,那么一个好的推荐算法必然会创造更大的价值,刚好最近听了一个关于推荐算法的讲座,写出来一些思考吧,算是分享一下。
1448 0
系统思考
最近发现一本关于提高系统思维能力的书,是一本你读起来很容易接受,逻辑很清楚的书,下面我就总结下,给大家参考下 背景 一般在我们工作或者生活的过程中都会碰到下面三中情况 遇到事情突然想不清楚 表达时说不清楚 学习的时候学的慢 以上的场景可能不是所有人都遇到过,但这个不是最关键的。
1601 0
智能推荐系统开发中的十个关键注意点
作者:陈运文 博士,盛大智能推荐团队负责人 亚马逊的CEO Jeff Bezos曾经说过,他的梦想是“如果我有100万个用户,我就要为他们做100万个亚马逊网站”。智能推荐系统承载的就是这个梦想,即通过数据挖掘技术,为每一个用户实现个性化的推荐结果,让每个用户更便捷的获取信息。
2041 0
c++ 如何获取系统时间
c++ 如何获取系统时间2008-04-28 15:34//方案— 优点:仅使用C标准库;缺点:只能精确到秒级 #include #include int main( void ) { time_t t = time(0); char tmp[64]; strftime( tmp, size...
929 0
+关注
290
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载