如何开发打点统计系统
最近做了一个打点统计系统,统计系统肯定各个公司都有做过,至于怎么做就不好说了。我见过最多的就是使用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。至少能扛过一阵了。
本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3773196.html,如需转载请自行联系原作者

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
php的memcache和memcached扩展区别
老生长谈的问题了。我这里就整理一下。 memcache的文档在:http://pecl.php.net/package/memcache memcached的文档在:http://pecl.php.net/package/memcached 首先看下时间,memcache最早是在2004年2月开发的,最后更新是在2013年4月,而memcached最早是在2009年1月开发的,最后更新是在2014年1月更新的。所以memcache的历史比memcached早。 在安装memcache扩展的时候并不要求安装其他东东,但是在安装memcached的时候会要求你安装libmemcached,问题来了,libmemcached是memcache的C客户端,它具有的优点是低内存,线程安全等特点。比如新浪微博之前就全面将php的memcache替换成php的memcached,在高并发下,稳定性果断提高。 memcache的方法列表在:http://cn2.php.net/memcache memcached的方法列表在:http://www.php.net/manual/zh/book.me...
- 下一篇
no suitable HttpMessageConverter found for request type [java.lang.Int...
今天在使用Spring Template的时候遇到了这个异常: no suitable HttpMessageConverter found for request type [java.lang.Integer] Google了一下然后在stackoverflow上面找到了解决方案: I have a method in Spring rest service. @RequestMapping(value = "test/process", method = RequestMethod.POST) public @ResponseBody MyResponse processRequest(String RequestId, int count) I am using Spring RestTemplate to call this service like this. RestTemplate restTemplate = this.getRestTemplate(); MultiValueMap<String, Object> map = new LinkedMult...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Mario游戏-低调大师作品
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路