当前位置:首页>python>告别手动熬夜!用Python打造华为/华三交换机配置自动备份系统,网工必看!

告别手动熬夜!用Python打造华为/华三交换机配置自动备份系统,网工必看!

  • 2026-07-02 16:28:23
告别手动熬夜!用Python打造华为/华三交换机配置自动备份系统,网工必看!
作为一名网络工程师,你是否经历过这样的场景:凌晨两点,还在逐台登录交换机,复制粘贴display current-configuration,就为了备份那几十台设备的配置?稍有不慎,漏掉一台或者命令输错,第二天就可能面临背锅的风险。
手动备份,不仅效率低下,更是网络运维中最大的风险源之一。今天,我们就来聊聊如何利用Python,从零搭建一套属于你自己的华为、华三交换机配置自动备份系统,让你彻底告别重复劳动。
一、 为什么要实现自动化备份?
在开始之前,我们得先明确目标。除了把你从熬夜中解放出来,自动化备份的核心价值在于:确保备份的时效性和一致性。
网络配置是动态的,一次变更后如果没有及时备份,之前的备份就失去了意义。一套可靠的自动化机制,可以在配置发生变化后,或者按照既定周期,自动、无差别地执行备份任务,为故障回滚和审计追溯提供坚实的数据基础。
二、 方案选型:哪种方式更适合你?
目前,实现华为/华三设备配置备份主要有两种自动化路径,你可以根据自身情况选择:
方案一:设备内置定时任务(零脚本,适合纯备份)
如果你的需求仅仅是定时备份,且环境相对简单,可以直接利用交换机自身的 scheduler 功能。
华为(VRP系统):通过scheduler task创建定时任务,执行save和tftp put命令。
华三(Comware系统):通过scheduler job和scheduler schedule,周期性地执行python脚本或直接执行CLI命令。
优点:无需额外服务器,配置简单。
缺点:灵活性差,难以实现复杂的逻辑判断和集中管理。
方案二:Python脚本集中管理(推荐,功能强大)
这是本文的重点。由一台中央服务器(可以是你的电脑或Linux服务器)通过SSH协议,主动连接所有交换机,批量拉取配置。
这种方式集中化管理、扩展性强、便于与运维平台集成,是更专业的选择。
三、 从零到落地:Python脚本实战(SSH方式)
我们采用最常用的方案:Python + Netmiko库,实现多厂商设备的SSH连接与配置采集。
第一步:环境搭建(PyCharm + 库安装)
1.安装Python:推荐使用Python 3.8及以上版本。在官网下载安装时,记得勾选“Add Python to PATH”。
2.安装PyCharm:作为Python的集成开发环境(IDE),它能极大地方便我们编写和调试代码。
3.创建项目与虚拟环境:打开PyCharm,新建项目。建议勾选“Create a virtual environment”,这能隔离项目依赖,避免冲突。
4.安装核心依赖库:在PyCharm底部的Terminal终端中,执行以下命令:
pip install netmiko paramiko pandas openpyxl
    netmiko:我们操作网络设备的核心利器,它封装了paramiko,并针对华为、华三等厂商优化了SSH交互逻辑,能自动处理分页等恼人问题。
    pandas & openpyxl:用于读取设备清单(IP、账号、密码)

    第二步:准备设备信息表

    在电脑新建一个csv文件,命名为devices.csv。包含以下列:设备名称、IP地址、管理账号、密码、设备类型
    user@user-pc:/network$ ls -l总用量 44drwxr-xr-2 user user  4096 7月   1 10:14 backup-rw-rw-r-- 1 user user   619 7月   1 09:01 backup_error.log-rw-rw-r-- 1 user user 14962 7月   1 10:08 backup_switch_config.py-rw-rw-r-- 1 user user 14274 7月   1 10:08 backup_switch_config.py.bak-rw------- 1 user user  1524 7月   1 09:34 devices.csvuser@user-pc:/network$ 
    user@user-pc:/network$ cat devices.csv ip,username,password,device_type,description,conn_timeoutxx.xx.xx.xx,admin,password,hp_comware,核心交换机,30xx.xx.xx.xx,admin,password,huawei,接入交换机,30# ip填写您自己交换机的ip#username,password,device_type根据您自己情况填写。
    第三步:核心代码实现
    这个代码是我已经在生成环境验证了的。里面包含了注释。
    user@user-pc:/network$ cat backup_switch_config.py#!/usr/bin/env python3# -*- coding: utf-8 -*-# ============================================================# 第一部分:导入需要的库(Python的"工具箱")# ============================================================import pandas as pd  # pandas是数据分析库,用来读取CSV文件(类似Excel表格)# 我们把设备清单保存在CSV里,用pandas可以轻松读取from netmiko import ConnectHandler  # netmiko是网络设备自动化核心库# ConnectHandler是它的"连接器",专门用来SSH登录网络设备from datetime import datetime  # datetime是日期时间库,用来获取当前时间# 我们用它给备份文件打上时间戳,比如 20260701_143000import os  # os是操作系统接口库,用来操作文件和目录# 我们用它来检查/创建备份文件夹import time  # time是时间库,用来让程序"等待"# 我们用它来实现重试间隔(连接失败后等几秒再试)# ============================================================# 第二部分:配置区域(你需要修改的地方)# ============================================================CSV_FILE = "/network/devices.csv"  # CSV文件的存放路径,里面记录了所有设备的信息# 格式:ip,username,password,device_type,description,conn_timeoutBACKUP_DIR = "/network/backup"  # 备份文件的存放目录,所有配置备份都会保存在这里MAX_RETRIES = 3  # 最大重试次数:如果连接失败,最多尝试3次# 网络有时候不稳定,多试几次能提高成功率RETRY_DELAY = 5  # 重试间隔(秒):每次重试之间等待5秒# 给设备一点"喘息"时间,避免频繁连接导致设备拒绝DEFAULT_TIMEOUT = 60  # 命令执行超时(秒):执行一条命令最多等60秒# 如果设备响应慢(比如配置很大),60秒应该足够了DEFAULT_CONN_TIMEOUT = 30  # SSH连接超时(秒):建立SSH连接最多等30秒# 如果网络延迟高,可以调大这个值# ============================================================# 第三部分:函数1 - 从CSV读取设备列表# ============================================================def read_devices_from_csv(file_path):    """    从CSV文件读取设备列表    参数:file_path = CSV文件的路径    返回值:设备列表(每个设备是一个字典)    """    try:  # try = "尝试执行",如果出错就跳到except        # 用pandas读取CSV文件,编码用utf-8(支持中文)        df = pd.read_csv(file_path, encoding='utf-8')        # df是DataFrame,可以理解为"表格数据"        # 定义必需的列名(这些列必须存在)        required_columns = ['ip''username''password']        # 循环检查每一列是否都在表格里        for col in required_columns:            if col not in df.columns:  # 如果某列不存在                print(f"❌ CSV文件缺少必需列: {col}")                print(f"   当前列名: {list(df.columns)}")                return []  # 返回空列表,表示读取失败        # 把表格转换为字典列表        # 每行数据变成一个字典,比如:        # {'ip': '192.168.1.1', 'username': 'admin', 'password': '123'}        devices = df.to_dict('records')        # 打印成功读取的设备数量        print(f"✅ 从CSV读取到 {len(devices)} 台设备")        # 打印设备列表预览(让用户确认读对了)        print("\n📋 设备列表预览:")        for i, device in enumerate(devices):  # enumerate给每个设备编号(从0开始)            desc = device.get('description''未命名')  # 获取描述,如果没有则显示"未命名"            dev_type = device.get('device_type''hp_comware')  # 获取设备类型,默认H3C            # 安全获取超时值,处理可能的空值            raw_timeout = device.get('conn_timeout', DEFAULT_CONN_TIMEOUT)            try:                if pd.isna(raw_timeout):                    timeout = DEFAULT_CONN_TIMEOUT                else:                    timeout = int(float(raw_timeout))            except (ValueError, TypeError):                timeout = DEFAULT_CONN_TIMEOUT            print(f"   {i + 1}{device['ip']} ({desc}) [类型: {dev_type}, 超时: {timeout}s]")            # 打印:序号. IP (描述) [类型: xxx, 超时: xx秒]        print()  # 打印空行        return devices  # 返回设备列表    except FileNotFoundError:  # 如果文件不存在        print(f"❌ 找不到文件: {file_path}")        print("💡 请确保CSV文件在 /network 目录下")        return []  # 返回空列表    except Exception as e:  # 捕获其他所有异常        print(f"❌ 读取CSV失败: {e}")        return []  # 返回空列表# ============================================================# 第四部分:函数2 - 备份单台设备(核心逻辑)# ============================================================def backup_single_device(device_info):    """    备份单台设备(支持H3C和华为,带重试机制)    参数:device_info = 一个字典,包含设备的所有信息    返回值:(是否成功, 错误信息)    """    # ----- 从字典中提取设备信息 -----    ip = device_info['ip']  # 设备IP地址    username = device_info['username']  # 登录用户名    password = device_info['password']  # 登录密码    device_type = device_info.get('device_type''hp_comware')  # 设备类型,默认H3C    description = device_info.get('description''未知设备')  # 设备描述    # 读取自定义超时,如果没有则使用默认值    # 安全处理conn_timeout,防止空值导致错误    raw_timeout = device_info.get('conn_timeout', DEFAULT_CONN_TIMEOUT)    try:        if pd.isna(raw_timeout):  # 处理空值            conn_timeout = DEFAULT_CONN_TIMEOUT        else:            conn_timeout = int(float(raw_timeout))  # 兼容各种数字格式    except (ValueError, TypeError):        conn_timeout = DEFAULT_CONN_TIMEOUT    # ----- 构建连接信息(告诉netmiko怎么连)-----    connect_info = {        'device_type': device_type,  # 设备类型(hp_comware=H3C, huawei=华为)        'ip': ip,  # IP地址        'username': username,  # 用户名        'password': password,  # 密码        'timeout': DEFAULT_TIMEOUT,  # 命令执行超时        'conn_timeout': conn_timeout,  # SSH连接超时    }    # H3C设备需要secret(enable密码,相当于进入特权模式的密码)    if device_type == 'hp_comware':        connect_info['secret'] = password  # 如果enable密码和登录密码相同    # ----- 生成备份文件名 -----    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")      # 获取当前时间,格式:年月日_时分秒,例如 20260701_143000    safe_desc = description.replace('/''_').replace('\\''_')      # 把描述中的 / 和 \ 替换成 _,防止文件名出错    filename = f"{BACKUP_DIR}/{ip}_{safe_desc}_{timestamp}.txt"      # 完整文件名:/network/backup/192.168.1.1_核心交换机_20260701_143000.txt    # 打印连接信息,让用户知道正在操作哪台设备    print(f"🔗 [{description}] 正在连接 {ip} (类型: {device_type}, 超时: {conn_timeout}s) ...")    # ===== 重试循环 =====    # range(1, 4) 会生成 1, 2, 3(从1到3,不包含4)    for attempt in range(1, MAX_RETRIES + 1):        try:            # 如果不是第一次尝试(attempt > 1),说明之前失败了            if attempt > 1:                print(f"   🔄 第 {attempt} 次重试 (等待{RETRY_DELAY}秒后)...")                time.sleep(RETRY_DELAY)  # 等待5秒再重试            # ----- 建立SSH连接 -----            conn = ConnectHandler(**connect_info)              # **connect_info 表示把字典拆成关键字参数            # 相当于 ConnectHandler(device_type='hp_comware', ip='...', ...)            print(f"   ✅ SSH连接成功")            # ----- 关闭分页显示(防止输出被截断)-----            # H3C设备的命令:terminal length 0(0表示不分页)            if device_type == 'hp_comware':                conn.send_command("terminal length 0")            # 华为设备的命令:screen-length 0 temporary(0表示不分页)            elif device_type == 'huawei':                conn.send_command("screen-length 0 temporary")            else:  # 其他未知设备,尝试H3C的命令                conn.send_command("terminal length 0")            # ----- 获取配置 -----            print(f"   📥 正在获取配置...")            # send_command = "发送命令并等待返回结果"            # display current-configuration = 显示当前所有配置(华为/H3C通用)            config = conn.send_command("display current-configuration")            # display version = 显示系统版本信息            version = conn.send_command("display version")            # ----- 断开SSH连接(养成好习惯)-----            conn.disconnect()            # ----- 保存备份到文件 -----            os.makedirs(BACKUP_DIR, exist_ok=True)              # 创建备份目录,如果已存在则忽略(exist_ok=True)            # 等效于 mkdir -p /network/backup            # with open = 打开文件,自动处理关闭(即使出错也会关闭)            # 'w' = 写入模式,encoding='utf-8' = 支持中文            with open(filename, 'w', encoding='utf-8'as f:                # f.write = 写入内容到文件                f.write("=" * 70 + "\n")  # 70个等号,做分隔线                f.write(f"设备IP: {ip}\n")                f.write(f"设备描述: {description}\n")                f.write(f"设备类型: {device_type}\n")                f.write(f"备份时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")                f.write("=" * 70 + "\n\n")                f.write("【系统信息】\n")                f.write("-" * 40 + "\n")                f.write(version + "\n\n")                f.write("【当前配置】\n")                f.write("-" * 40 + "\n")                f.write(config + "\n")            print(f"   ✅ 备份成功 → {filename}")            return TrueNone  # 返回(成功, 无错误)        except Exception as e:  # 如果上面的try中任何一步出错            error_msg = str(e)  # 把错误信息转为字符串            # 如果是最后一次尝试(attempt == MAX_RETRIES)            if attempt == MAX_RETRIES:                print(f"   ❌ 备份失败(已重试{MAX_RETRIES}次): {error_msg[:150]}")                # 记录错误日志                error_log = f"{BACKUP_DIR}/backup_error.log"                # 'a' = append模式,追加写入(不会覆盖之前的日志)                with open(error_log, "a", encoding='utf-8'as log:                    log.write(                        f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | {ip} | {description} | {device_type} | 失败: {error_msg}\n"                    )                return False, error_msg  # 返回(失败, 错误信息)            else:                # 不是最后一次,打印警告并继续重试                print(f"   ⚠️  连接失败 ({attempt}/{MAX_RETRIES}): {error_msg[:80]}")    # 如果循环结束还没有返回(理论上不会执行到这里)    return False"未知错误"# ============================================================# 第五部分:主程序(程序的入口)# ============================================================def main():    """主程序 - 控制整个备份流程"""    # ----- 打印程序标题 -----    print("=" * 70)    print("🚀 多厂商交换机批量配置备份工具 (H3C + 华为)")    print(f"📅 开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")    print(f"📁 CSV文件: {CSV_FILE}")    print(f"📁 备份目录: {BACKUP_DIR}")    print(f"🔄 最大重试次数: {MAX_RETRIES}")    print("=" * 70)    # ----- 检查备份目录,不存在则创建 -----    if not os.path.exists(BACKUP_DIR):  # 如果目录不存在        os.makedirs(BACKUP_DIR)  # 创建目录        print(f"✅ 创建备份目录: {BACKUP_DIR}")    # ----- 读取设备列表 -----    devices = read_devices_from_csv(CSV_FILE)    if not devices:  # 如果列表为空(读取失败)        print("❌ 没有读取到任何设备,程序退出")        return  # 退出程序    # ============================================================    # 修改点:取消用户确认,实现自动化    # ============================================================    print(f"ℹ️  自动模式:即将备份 {len(devices)} 台设备...")    # 自动化备份不需要用户确认,直接继续执行    # ============================================================    # ----- 开始备份每一台设备 -----    print("\n" + "=" * 70)    success_count = 0  # 成功计数器    failed_devices = []  # 失败设备列表    # enumerate(devices, 1) 从1开始编号    for i, device in enumerate(devices, 1):        print(f"\n📌 进度: {i}/{len(devices)}")        success, error = backup_single_device(device)  # 调用备份函数        if success:            success_count += 1  # 成功数+1        else:            # 记录失败设备            failed_devices.append({                'ip': device['ip'],                'description': device.get('description''未知'),                'error': error            })        print("-" * 50)  # 分隔线    # ----- 打印最终结果汇总 -----    print("\n" + "=" * 70)    print("📊 备份完成!")    print(f"   ✅ 成功: {success_count}/{len(devices)} 台")    if failed_devices:  # 如果有失败的设备        print(f"   ❌ 失败: {len(failed_devices)} 台")        print("\n失败设备列表:")        for dev in failed_devices:            print(f"   - {dev['ip']} ({dev['description']})")        print(f"\n💡 详细错误请查看: {BACKUP_DIR}/backup_error.log")    else:  # 全部成功        print("🎉 全部设备备份成功!")    print("=" * 70)# ============================================================# 第六部分:程序入口判断# ============================================================if __name__ == "__main__":    """    这个判断的含义:    - 如果这个文件是直接运行的(python backup_switch_config.py)      则执行 main() 函数    - 如果这个文件是被其他文件导入的(import backup_switch_config)      则不执行 main(),只提供函数供其他文件调用    这是一个标准的Python编程规范    """    main()user@user-pc:/network$ 
    四、 进阶思考:如何让备份更专业?
    1.对接FTP/SFTP服务器:上面的脚本是通过屏幕回显抓取配置。更稳定的做法是在交换机上配置FTP/SFTP服务,通过脚本触发save和tftp put命令,直接将配置文件上传至服务器。这能避免因屏幕输出延迟导致的内容截断。
    我们没有服务器,直接就备份到了我自己电脑上。这里就不做演示。
    2.配合计划任务实现无人值守:将写好的Python脚本部署在服务器上,通过Windows任务计划程序或Linux的Crontab,设置每天凌晨自动运行,实现彻底的无人值守备份。
    # 编辑定时任务crontab -e# 每天凌晨2点自动备份0 2 * * * cd /network && python3 backup_switch_config.py >> /network/backup/backup.log 2>&1
    五、总结

    从手动熬夜到一键全自动,差的只是一个Python脚本的距离。通过本文的指引,相信你已经具备了搭建自己备份系统的基础能力。
    自动化不仅是工具,更是一种思维。用代码解决重复劳动,把精力留给更有价值的网络优化和架构设计,这才是新时代网工该有的样子。
    你的网络,值得更智能的运维。

    最新文章

    随机文章

    基本 文件 流程 错误 SQL 调试
    1. 请求信息 : 2026-07-02 23:32:11 HTTP/2.0 GET : https://f.mffb.com.cn/a/502806.html
    2. 运行时间 : 0.182724s [ 吞吐率:5.47req/s ] 内存消耗:4,660.91kb 文件加载:140
    3. 缓存信息 : 0 reads,0 writes
    4. 会话信息 : SESSION_ID=156cc00b29d1623a952c25c4071bc1cf
    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.000582s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
    2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000869s ]
    3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000431s ]
    4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.004182s ]
    5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000766s ]
    6. SELECT * FROM `set` [ RunTime:0.008364s ]
    7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000665s ]
    8. SELECT * FROM `article` WHERE `id` = 502806 LIMIT 1 [ RunTime:0.002295s ]
    9. UPDATE `article` SET `lasttime` = 1783006331 WHERE `id` = 502806 [ RunTime:0.011540s ]
    10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000685s ]
    11. SELECT * FROM `article` WHERE `id` < 502806 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.026099s ]
    12. SELECT * FROM `article` WHERE `id` > 502806 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.010076s ]
    13. SELECT * FROM `article` WHERE `id` < 502806 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.035269s ]
    14. SELECT * FROM `article` WHERE `id` < 502806 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001081s ]
    15. SELECT * FROM `article` WHERE `id` < 502806 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.007706s ]
    0.184267s