当前位置:首页>python>写了个Python脚本监控服务器,再也不怕半夜被告警吵醒

写了个Python脚本监控服务器,再也不怕半夜被告警吵醒

  • 2026-06-29 22:33:59
写了个Python脚本监控服务器,再也不怕半夜被告警吵醒

这个场景是不是似曾相识:凌晨三点十四分,手机狂震。

从床上弹起来,心跳飙到120,打开企业微信一看——

⚠️ 告警:web-03 CPU使用率 82.3%

八十二。

我盯着屏幕看了五秒钟,把手机摔回枕头底下,翻了个身继续睡。

不是我摆烂,是这个破告警我见过太多次了。web-03是台老机器,跑的是个Java应用,JVM一起来CPU就没低于过70%。设了80%的告警阈值,结果一天能报十几次,每次打开看都啥事没有。

这种狼来了式的告警,比不告警还可怕——它让你对所有告警都失去信任,等真正出故障的时候,你反而不当回事了。

被折腾了半年之后,我终于下决心自己写了个监控脚本。核心思路就一个:与其让告警通知我,不如让告警只在该通知的时候通知我。

现在跑了快一年了,半夜被吵醒的次数从每月四五次降到基本为零。今天把这套东西整理出来,代码不多,但坑踩了不少。

往期阅读>>>

Python 为什么会成为AI时代的头部语言

Python 40个常用的列表推导式

Python 50个提高代码开发效率的方法

Python 自动检测服务HTTPS证书过期时间并发送预警

Python 自动化操作Redis的15个实用脚本

Python 自动化管理Jenkins的15个实用脚本,提升效率

Python copyparty搭建轻量的文件服务器的方法

Python 实现2FA认证的方法,提升安全性

Python 封装20个常用API接口,提升开发效率

App2Docker:如何无需编写Dockerfile也可以创建容器镜像

Python 集成 Nacos 配置中心的方法

Python 35个JSON数据处理方法

Python 字典与列表的20个核心技巧

Python 15个文本分析的库,提升效率

Python 15个Pandas技巧,提升数据分析效率

Python 运维中30个常用的库,提升效率

Python调用远程接口的方法

Python 提取HTML文本的方法,提升效率

Python 应用容器化方法:实现“一次部署,处处运行”

Python 自动化识别Nginx配置并导出为excel文件,提升Nginx管理效率

Python 5个常见的异步任务处理框架

Python数据科学常见的30个库

Python 50个实用代码片段,优雅高效


先说基础:psutil这个库真的好用

Python做服务器监控,psutil 是标配。这个库基本上把你能想到的系统指标都封装好了:

import psutil# CPU使用率(取1秒的采样)cpu = psutil.cpu_percent(interval=1)# 内存mem = psutil.virtual_memory()print(f"内存使用率: {mem.percent}%")print(f"可用内存: {mem.available / 1024**3:.1f}GB")# 磁盘disk = psutil.disk_usage('/')print(f"磁盘使用率: {disk.percent}%")# 网络net = psutil.net_io_counters()print(f"累计发送: {net.bytes_sent / 1024**2:.1f}MB")print(f"累计接收: {net.bytes_recv / 1024**2:.1f}MB")# 进程级别的监控也行(注意:第一次调用cpu_percent返回0,需调两次)psutil.process_iter(['pid''name''cpu_percent'])  # 第一次,预热time.sleep(1)for proc in psutil.process_iter(['pid''name''cpu_percent''memory_percent']):if proc.info['cpu_percent'andproc.info['cpu_percent'>50:print(f"高CPU进程: {proc.info['name']} (PID:{proc.info['pid']})")

pip install psutil 装完就能用,跨平台,Linux/macOS/Windows都行。不需要什么特殊权限,普通用户就能跑大部分指标。

有了数据源,接下来就是怎么判断该不该告警。这才是重点。


告警策略,这才是重点

大多数入门级监控教程的告警逻辑是这样的:

if cpu>80:send_alert("CPU过高!")

我当初也是这么写的。然后就被现实教育了。

问题出在哪?这种一刀切的阈值完全不考虑实际情况。CPU 82%在空闲时段确实该报警,但如果这台机器本身就在跑批处理任务,82%完全正常。你得让脚本有点判断力

我后来改成了分级策略,思路很简单:

# config.py — 监控配置集中管理THRESHOLDS = {'cpu': {'warning'80,       # 提醒级别,不紧急'critical'95,      # 严重级别,需要关注'sustained_minutes'5# 连续超过阈值N分钟才算真的有问题    },'memory': {'warning'85,'critical'95,'sustained_minutes'3    },'disk': {'warning'85,'critical'95,'sustained_minutes'0# 磁盘不需要持续判断,超了就是超了    }}# 告警级别定义ALERT_LEVELS = {'info''仅记录日志','warning''发群消息,不@人','critical''发群消息,@值班人'}

改了俩地方:阈值分成了 warning 和 critical 两档,不同级别走不同的通知通道;另外加了个持续时长判断——CPU偶尔飙一下太正常了,连续5分钟都高才是真有问题。


持续时长判断,这个功能救了我的命

这是整套脚本里我最满意的一个功能,也是让告警量直接砍掉80%的关键。

原理很简单:每次检测到指标超标时,不急着报警,先记下来。如果接下来连续N次检测都超标,才真正发出告警。

import timefrom collections import defaultdictclass AlertStateManager:"""管理每个指标的告警状态"""def __init__(self):# 记录每个指标首次超标的时间self.first_breach = {}# 记录已经告警过的指标,避免重复self.alerted = set()def check(selfmetric_namevaluethresholdsustained_seconds=300):"""        检查指标是否需要告警        返回: None(不告警), 'warning'(首次告警), 'repeat'(重复告警)        """key = f"{metric_name}:{threshold}"if value>threshold:now = time.time()if key not in self.first_breach:# 第一次超标,记下来,先不报警self.first_breach[key] = nowreturn None# 已经超标一段时间了,判断是否达到持续时长duration = now-self.first_breach[key]if duration>sustained_seconds:if key not in self.alerted:self.alerted.add(key)return 'warning'return 'repeat'# 持续超标但已经报过了return None# 还没到持续时长,继续观察else:# 指标恢复正常,清除记录if key in self.first_breach:del self.first_breach[key]if key in self.alerted:self.alerted.discard(key)return 'recovered'# 可选:发一条恢复通知return None

这段代码跑起来的逻辑是:CPU第一次飙到阈值以上,脚本默默记下来。过了5分钟还在阈值以上,才真正发告警。如果中间掉回正常值以下,计时器清零,从头再来。

光这一个功能,就把那些瞬时波动引发的假告警全干掉了。


告警聚合,别让群消息炸了

另一个让我头疼的问题是:一旦服务器出问题,往往是连锁反应。CPU高了,内存也跟着飙,磁盘IO也跟着打满。按以前的逻辑,三个指标各发一条告警,群里瞬间三条消息。如果十台服务器同时出问题,那就是三十条。

所以我在发送端做了一层聚合:

from collections import defaultdictimport threadingclass AlertAggregator:"""在一个时间窗口内收集告警,合并发送"""def __init__(selfwindow_seconds=60):self.window = window_secondsself.pending = defaultdict(list)self.timer = Noneself.lock = threading.Lock()def add(selfhostmetricvaluelevel):with self.lock:self.pending[host].append({'metric'metric,'value'value,'level'level            })# 每次来新告警都重置定时器(标准debounce策略)if self.timer is not None:self.timer.cancel()self.timer = threading.Timer(self.windowself._flush)self.timer.start()def _flush(self):"""把攒了一分钟的告警合并成一条消息发出去"""with self.lock:if not self.pending:self.timer = Nonereturnlines = ["## ⚠️ 服务器告警汇总\n"]for hostalerts in self.pending.items():lines.append(f"**{host}**:")for in alerts:emoji = "🔴"ifa['level'] == 'critical'else"🟡"lines.append(f"> {emoji} {a['metric']}:{a['value']}")lines.append("")message = "\n".join(lines)send_to_wechat(message)  # 你之前写的通知函数self.pending.clear()self.timer = None

这样做的好处是:一分钟内产生的所有告警,会合并成一条消息发出来。群里清爽,信息量还更大。

我之前有次一台服务器挂了,连锁反应触发了12条告警。用了聚合之后,群里只收到一条消息,但里面12个指标全列出来了。同事说这个体验比被消息刷屏好太多了。


静默期:半夜就别吵我了

这个功能是写这套脚本的初衷——我真的不想半夜被告警吵醒。

但也不能真的把告警全关了,万一半夜服务器宕机呢?所以得区分重要不重要

from datetime import datetimeclass QuietHoursManager:def __init__(selfquiet_start=23quiet_end=8):self.quiet_start = quiet_startself.quiet_end = quiet_enddef is_quiet_now(self):hour = datetime.now().hourreturn hour>self.quiet_startorhour<self.quiet_enddef should_alert(selflevel):"""        静默期间的告警策略:        - critical 级别:照常告警,该叫就叫        - warning 级别:只记日志,等早上统一汇报        - info 级别:直接忽略        """if not self.is_quiet_now():returnTrue# 非静默期,全部告警if level == 'critical':returnTrue# 严重问题,半夜也得叫起来# warning 和 info 在静默期只记日志log_to_file(f"[静默期-抑制] {level} 级别告警已记录,待早上汇报")return False

逻辑很直接:晚上11点到早上8点之间,只有 critical 级别的告警才会推送到群里。warning 的存到日志里,第二天早上发一条汇总。

我还在早上8点自动发一条夜间简报

def morning_summary():"""每天早上8点发送夜间告警汇总"""overnight_alerts = get_alerts_since(hours_ago=9)if not overnight_alerts:send_to_wechat("## ☀️ 早间简报\n> 昨晚一切正常,无告警记录。")else:lines = [f"## 🌅 夜间告警汇总(共{len(overnight_alerts)}条)\n"]for alert in overnight_alerts:lines.append(f"> [{alert['time']}] {alert['host']} - {alert['metric']}: {alert['value']}")send_to_wechat("\n".join(lines))

这条消息现在是我们组每天早上的早餐伴侣,大部分人看一眼无告警就去干活了。


进程级别的监控,有时候比系统指标更有用

系统级的CPU、内存告警有时候不够精准。比如一台服务器CPU只有60%,但某个进程自己吃掉了40%——系统层面看着没事,但这个进程可能已经在影响业务了。

所以我又加了一层进程监控:

import psutildef check_top_processes(top_n=5):"""找出占资源最多的进程"""processes = []for proc in psutil.process_iter(['pid''name''cpu_percent''memory_percent''status']):try:info = proc.infoif info['cpu_percent'andinfo['cpu_percent'>20:processes.append(info)except (psutil.NoSuchProcesspsutil.AccessDenied):continue# 按CPU排序,取前Nprocesses.sort(key=lambda xx.get('cpu_percent'0), reverse=True)return processes[:top_n]def monitor_specific_process(process_namemax_memory_mb=2048):"""监控特定进程的内存使用,防止内存泄漏"""for procinpsutil.process_iter(['pid''name''memory_info']):try:if proc.info['name'] == process_name:mem_mb = proc.info['memory_info'].rss/1024/1024if mem_mb>max_memory_mb:return {'alert'True,'message'f"进程 {process_name}(PID:{proc.info['pid']}) 内存占用 {mem_mb:.0f}MB,超过阈值 {max_memory_mb}MB"                    }except (psutil.NoSuchProcesspsutil.AccessDenied):continuereturn {'alert'False}

这个功能在排查Java应用的内存泄漏时帮了大忙。有次我们的Spring Boot应用内存一直在涨,涨到3G多还没触发系统级告警(因为总内存有16G),但进程级监控直接报了。提前发现,提前处理,没酿成线上事故。


把上面的东西串起来

最后写一个主循环,把所有模块串起来。这里只展示CPU检查的完整逻辑,内存和磁盘同理:

import timeimport psutil# 初始化各模块alert_state = AlertStateManager()aggregator = AlertAggregator(window_seconds=60)quiet_hours = QuietHoursManager(quiet_start=23quiet_end=8)def check_and_alert(metric_namevalueconfig):"""统一的告警检查逻辑"""host = get_hostname()# 先检查critical级别status = alert_state.check(f'{metric_name}_critical'value,config['critical'],sustained_seconds=config['sustained_minutes'*60    )if status == 'warning':if quiet_hours.should_alert('critical'):aggregator.add(hostmetric_namef'{value}%(严重)''critical')return# critical已触发,不用再检查warning# 再检查warning级别status = alert_state.check(f'{metric_name}_warning'value,config['warning'],sustained_seconds=config['sustained_minutes'*60    )if status == 'warning':if quiet_hours.should_alert('warning'):aggregator.add(hostmetric_namef'{value}%''warning')def run_monitor(interval=60):"""主监控循环"""print("监控已启动,按 Ctrl+C 停止...")whileTrue:try:cpu = psutil.cpu_percent(interval=1)mem = psutil.virtual_memory().percentdisk = psutil.disk_usage('/').percentcheck_and_alert('CPU'cpuTHRESHOLDS['cpu'])check_and_alert('内存'memTHRESHOLDS['memory'])# 磁盘sustained_minutes=0,超了就报check_and_alert('磁盘'diskTHRESHOLDS['disk'])# 检查关键进程java_status = monitor_specific_process('java'max_memory_mb=3072)if java_status.get('alert'):if quiet_hours.should_alert('warning'):aggregator.add(get_hostname(), 'Java进程',java_status['message'], 'warning')except Exceptionase:# 监控脚本自身出错也要通知,不能悄悄挂了send_to_wechat("监控脚本异常: {e}")time.sleep(interval)

跑起来之后,脚本每分钟检查一次所有指标。大部分时候它安安静静的,只有真正出了问题才会说话。


踩过的坑,都是凌晨三点换来的

坑一:psutil.cpu_percent() 第一次调用永远不准

这个坑我踩了好久。psutil.cpu_percent(interval=1) 第一次调用的结果往往偏高或者偏低,因为它需要一个时间窗口来计算CPU使用率,第一次采样没有对比基准

解决办法:启动时先调一次丢掉结果

# 启动时预热一次(interval=1 会阻塞1秒,自带采样)psutil.cpu_percent(interval=1)# 从第二次调用开始才是有效数据

文档里有提到这个,但我当时没仔细看,浪费了一个下午排查为什么脚本一启动就报警

坑二:监控脚本自己挂了没人知道

这是个很讽刺的问题——你写了个监控脚本,结果监控脚本自己挂了,然后没人发现。

所以我做了两件事:一是脚本自身用 supervisor 管理,挂了自动拉起来;二是加了心跳机制——脚本每10分钟往一个文件里写一次时间戳,再写一个独立的小脚本每15分钟检查一次这个文件,如果时间戳太久没更新,就发告警说监控脚本可能挂了

套娃是套娃了点,但管用。

坑三:时区问题又出现了

对,又是时区。我的静默期逻辑用的是 datetime.now().hour,结果服务器是UTC时区。我以为设置了晚上11点到早上8点静默,实际上是UTC 23:00到UTC 8:00,换算成北京时间是早上7点到下午4点。

也就是说,工作时间的告警全被吞了,半夜反而正常推送。

修复很简单:

from datetime import datetimeimport pytzdef get_local_hour():tz = pytz.timezone('Asia/Shanghai')return datetime.now(tz).hour

坑四:阈值设太低,新机器一上来就疯狂告警

换了台新服务器,配置比老机器好很多,但监控脚本直接复用了老配置。结果新机器跑批处理的时候CPU能到90%(虽然完全没问题),老脚本不管这些,照报不误。

后来我给每台机器单独配了阈值,放在 config_{hostname}.yaml 里。别偷懒所有机器共用一份配置,硬件不一样的机器,正常的标准也不一样。


一张图看清告警流程

指标采集(每分钟)    ↓阈值判断(warning / critical)    ↓持续时长检查(连续超标N分钟?)    ↓ 是                    ↓ 否告警聚合器            继续观察(计时器清零)(60秒窗口内合并)    ↓静默期判断(当前是夜间?)    ↓ 是                    ↓ 否只推送critical         正常推送warning记日志    ↓早上8点发送夜间汇总

现在这套监控跑了快一年了

说几个数字吧:

刚上线那会儿,每天群里的告警消息大概30-40条。上了持续时长判断之后,降到了5-8条。再加上聚合和静默期,现在平均每天2-3条,每条都是有实际意义的。

半夜被告警叫醒的次数,从之前每月四五次,变成了过去11个月总共被叫了2次——那两次还确实是真故障,幸亏叫醒了。

整套代码加起来大概300多行,没有用什么高大上的框架,就是一个Python脚本加crontab。但它给我的感觉就是——终于有人替我值夜班了。

当然这脚本也不是万能的。上个月有次磁盘IO打满导致应用卡死,它就没检测到——因为我压根没写IO监控。后来补上了,但这件事提醒我:监控永远没有做完的一天,你永远在补下一个盲区。

如果你也被告警噪音困扰过,建议先从持续时长判断这个功能做起。就这一个改动,能让你的告警质量直线上升。

你们线上用的是Prometheus+Grafana这种专业方案,还是和我一样自己糊脚本?有用过告警聚合或者静默期策略的吗?欢迎在评论区交流下你的做法。

“无他,惟手熟尔”!有需要的用起来!
------加入知识库与更多人一起学习------

https://ima.qq.com/wiki/?shareId=f2628818f0874da17b71ffa0e5e8408114e7dbad46f1745bbd1cc1365277631c

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-02 23:28:07 HTTP/2.0 GET : https://f.mffb.com.cn/a/500156.html
  2. 运行时间 : 0.163797s [ 吞吐率:6.11req/s ] 内存消耗:4,704.41kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=2fdcecd46b0292c7a39b744baf0da156
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000516s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000797s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003926s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000337s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000495s ]
  6. SELECT * FROM `set` [ RunTime:0.000366s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000601s ]
  8. SELECT * FROM `article` WHERE `id` = 500156 LIMIT 1 [ RunTime:0.010531s ]
  9. UPDATE `article` SET `lasttime` = 1783006087 WHERE `id` = 500156 [ RunTime:0.039101s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.015970s ]
  11. SELECT * FROM `article` WHERE `id` < 500156 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003804s ]
  12. SELECT * FROM `article` WHERE `id` > 500156 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002535s ]
  13. SELECT * FROM `article` WHERE `id` < 500156 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000713s ]
  14. SELECT * FROM `article` WHERE `id` < 500156 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002555s ]
  15. SELECT * FROM `article` WHERE `id` < 500156 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006174s ]
0.167568s