Laravel 执行时间记录和统计工具

统计接口时间的方法有不少,比如修改nginx日志格式记录时间,或者直接使用网关统计,但是都不够简便,于是我自己写了这一个统计包,不需要修改服务器配置,不需要安装软件,也不需要后台运行进程,当然也足够简单。

写这个包的目的是用来统计接口运行时间的,方便发现响应慢的接口,然后优化。

laravel-running-time

  • 支持统计响应时间最长的请求
  • 支持日志延迟批量写入以提高性能
  • 支持单个请求地址分析
  • 支持友好的日期筛选
  • 实测100W行日志,2.3秒可分析完

GitHub 地址

欢迎大家使用和提意义

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 15

https://github.com/y-ui/laravel-running-time/blob/master/src/Commands/RunningTimeCommand.php
可以先array_filter下

$sortedPath  = array_filter($sortedPath );
foreach ($sortedPath as $key => &$value) {
            //if (empty($value)) {
            //    unset($sortedPath[$key]);
            //    continue;
            //}
            $value = [$value, $key];
        }
2个月前

@lovecn 是的,这样性能更好,代码也更好看~感谢~

2个月前
ruby

可以,哈哈,学会了 file() 的用法 :stuck_out_tongue_winking_eye:

2个月前
ruby

改了一下 RunningTimeCommand.php,使用了 fgets 配合 yield 减少内存的使用。同时 $pathTimes 只记录比较、统计的结果,不记录所有的数据,减少内存使用。

https://github.com/y-ui/laravel-running-time/pull/1

file

2个月前
ruby

修改了一下 pathTime 来兼容使用 yield 的写法.

没使用 yield 之前
file

使用 yield
file

2个月前

@ruby 非常优秀的想法,内存使用大大减少,不过真实场景下的计算时间并不像你测试的那样也减少了,我用我的真实数据跑了一下,计算时间增加了大概 34%左右,应该和每行日志的长度有关,内容越多,fgets导致的额外时间开销越多,我用最简单的日志测试计算时间增加15%,总体来说这个时间换来的内存节约非常划算 :+1:

没有yield:

file

使用yield:

file

2个月前
ruby

@y-ui 时间增加应该是的。昨天一不小心写了个 bug 进去,php artisan running-time 没有统计到最小时间,提了个 PR

2个月前

@ruby 哈哈,改出来的BUG不少呢,你这个pr我就不合并了

2个月前
ruby

@y-ui 还有什么其他 bug 吗 :joy:

2个月前

@ruby

  • path统计数量不正确
  • 你说的这个最小时间问题
  • 延迟批量写入功能不能用了
  • 检查目录是否存在不要每次都检查 ,延迟写入模式只需要在写入文件时检查,减少IO

我merge了你的第一个pr,然后修复了以上BUG,并且加入了 --lessMemory 选项使用你的读取文件方式。
默认还是使用file函数读取,但是使用yield,有效减少了多个日志文件统计时的内存开销,因为数据越多使用fgets花费时间越多,400W数据时 时间差达到了100%

2个月前

请教一个问题,接口响应时间按道理应该是请求结束时间-请求开始时间,为什么我看你的源代码是请求开始时间-依赖包加载的时间尼

1个月前
AlicFeng

我也整理了一个类似的,支持cliweb端的https://github.com/alicfeng/laravel-runtime

1个月前

@returnfalse 接口响应时间应该是服务器
@returnfalse 这个并不是中间件加载的时间,中间件有两种执行方式,一种是处理请求前,一种是返回请求后,我这里就是返回请求后执行,所以实际相当于请求结束的时间,具体可以看laravel的中间件文档

1个月前

@y-ui 嗯,明白了,一看文档我就懂了,谢谢,还是要交流,感觉有时候还是有知识盲区

1个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会