PHPstrtotime函数性能分析
近日,在一场比赛的数据统计后台,最基本的功能是通过注册登录日志显示用户数据。公司内部很少有用户测试,所以性能没有发现问题。但这两天在一起,在实际的测试环境,用户会澄城来了,从下午开始,统计在线人数开始卡,返回数据几秒钟;查询的速度注册号码。在晚上,统计在线人数基本上是没有时间了。虽然他们不知道他们玩的bug的另一边,玩家登录经常有问题,导致以在线人数并不是很多的注册。但量在这一点上我问数据查询速度是不好的,这是非常尴尬的。现在他们正在看游戏的bug,我正在查看统计后台中代码的位置。首先,我想解释一下我用于统计的数据来自于图书馆。他们使用主库,我这边的管理员数量很少,这不会影响游戏服的性能。
今天,这个项目的领导者将数据库引导到公司的服务器上,我复制了一个拷贝到机器上,看看统计平台的性能问题在哪里,然后发现即使注册统计数据也很难保存。服务器返回到两秒钟左右。这台机器需要20秒,而且经常超时(PHP的默认配置是30秒超时)。网上统计是没有必要的。看看数据库,当天的登记记录是3500左右(带假数据),每五分钟,一天就是统计288次。当然,这肯定不是一个循环查询数据库288次,那就要挨骂了。
在统计时间段的登记数量是非常简单的,即数据是走过每一个时间,和时间的大小与+ 1.but为什么是这个简单的逻辑相比,以及一百万周期,它怎么能跑只要半分钟吗
关键的问题是,时间到了,我们都知道,时间戳的时间是一个科学的方法和时间的数据库的大小一般是基于yyyy-mm-dd HH:II:SS,PHP strtotime函数转换的时间。然而,在288×3500的每一个祝福,执行时间是半分钟。
nowdaydt美元= strtotime(日期('y-m-d '));
__startt美元=瞬时(真的);
为($我= 0;美元美元美元我<<时间;我= $ gaptime){
$=0;
/ /数据比较
startdt美元美元美元nowdaydt +我=;
enddt美元=美元美元美元nowdaydt +我+ gaptime;
用于显示
xaxis1美元=日期(H:我,nowdaydt美元+我);
xaxis2美元=日期(H:我,nowdaydt美元美元美元+我+ gaptime);
foreach(数据线美元美元){
$时间= strtotime($线{ 'log_dt});
如果($ startdt <=美元美元美元时间时间< enddt){
数+;
}
}
resarr美元{ } = {
日期= > xaxis1美元。~ xaxis2美元,
数字
};
}
回波瞬时(真正的)__startt美元;
在这种情况下,它基本上是没有办法使用strtotime函数,那么什么是比较大小的时间吗答案非常简单和粗糙,PHP可以直接比较两个日期和时间字符串!因此更改后的代码如下所示,然后运行时间约为0.3秒。
__startt美元=瞬时(真的);
为($我= 0;美元美元美元我<<时间;我= $ gaptime){
$=0;
数据比较
startdt美元=日期('y-m-d H:我:',nowdaydt美元+我);
enddt美元=日期('y-m-d H:我:',nowdaydt美元美元美元+我+ gaptime);
用于显示
xaxis1美元=日期(H:我,nowdaydt美元+我);
xaxis2美元=日期(H:我,nowdaydt美元美元美元+我+ gaptime);
foreach(数据线美元美元){
时间线'log_dt美元美元= {};
如果($ startdt <=美元美元美元时间时间< enddt){
数+;
}
}
resarr美元{ } = {
日期= > xaxis1美元。~ xaxis2美元,
数字
};
}
回波瞬时(真正的)__startt美元;
遍历的再优化
你可能会发现一个问题,因为在foreach嵌套,这是一个有点担心foreach中要完成遍历的性能吗事实上,这是不必要的。只要SQL数据被检查,按时间排序,优化的时间比较算法如下:
为{…
foreach(数据线美元美元){
时间线'log_dt美元美元= {}; / / strtotime(合线'log_dt{ });
优化算法
如果(合时间< startdt美元继续); / /小于开始时间结束
如果(合时间> = $ enddt打破); / /大于结束时间
$ + +; /或符合条件
/原始算法
如果($ startdt <=美元美元美元时间时间< enddt){ / /
计算;
}
}
}…
这是一个巧妙地利用连续和中断关键字跳过一个周期和结束整个周期。这一次,在一天的统计开始时,数据的一大部分可以直接跳过。最后的遍历时间减少到约0.12秒。
在大数据的处理,我们应该尽量避免在遍历的数据转换,并避免一些复杂的功能,如strtotime