当前位置:首页>Linux>从命令到脚本:Linux运维必备Shell脚本进阶技巧,让自动化更稳健

从命令到脚本:Linux运维必备Shell脚本进阶技巧,让自动化更稳健

  • 2026-02-01 10:15:37
从命令到脚本:Linux运维必备Shell脚本进阶技巧,让自动化更稳健
上次咱们聊了Shell脚本入门,核心是把重复命令打包成脚本,实现简单自动化。
但入门脚本在生产环境中往往“不堪一击”:备份脚本因磁盘满静默失败,等到发现时已错过最佳恢复时机;半夜被紧急叫醒排查问题,却发现脚本没有任何日志记录,排查陷入僵局……这些痛点的根源,都是脚本缺少错误处理、日志记录与异常清理机制。
今天老唐就带大家升级玩法——把“能跑”的入门脚本,改造为“能扛”的生产级健壮脚本。

一、为什么你的脚本需要“强壮”起来?

入门脚本能满足基础自动化需求,但就像普通自行车能在小区遛弯代步,却不敢开上秋名山一样,无法应对生产环境的复杂场景。生产环境对脚本的核心要求有三点:
  • 遇事不崩,稳定“扛造”:脚本不能像脆皮大学生一样遇到错误就“破防崩溃”,得像打工人的电脑——卡死但绝不蓝屏。关键任务要有重试机制,重要操作要有回滚预案。
  • 处处留痕,拒绝“狼人杀”:不能像互联网嘴替只输出不记录。每个操作都要有清晰的“电子脚印”,出了问题不用玩“猜猜谁动了我的文件”这种悬疑游戏。
  • 优雅离场,不当“显眼包”:无论正常结束还是异常退出,都要像职场老油条一样会收拾场面——清理临时文件、释放锁定资源,绝不留下“赛博垃圾”让后续脚本踩坑。

    二、三大进阶技巧,让脚本脱胎换骨

    技巧1:给脚本装上“错误雷达”——用set命令开启全方位防护

    基础脚本的最大问题的是:即使某一步命令执行失败,脚本也会继续往下跑,最终导致错误扩散(比如用失败的备份数据覆盖旧的有效备份)。我们可以通过set系列命令,给脚本装上“错误雷达”,一旦检测到异常就及时止损。
    核心防护代码(直接放在脚本开头):
    #!/bin/bash# 遇到任何命令执行失败(返回非0状态码),立即退出脚本,避免错误扩散set -e# 遇到未定义的变量时,直接报错并退出脚本,防止因变量空值导致逻辑错误set -u# 调试模式:执行时显示每一条命令(调试阶段开启,正式运行时注释)# set -x# 管道命令防护:管道中任意一个命令失败,整个管道视为失败(默认管道只判断最后一个命令)set -o pipefail
    关键说明(避免踩坑):
    • set -e:最核心的防护——比如tar备份命令执行失败(返回非0),脚本会立即停止,不会继续执行后续的“覆盖旧备份”命令,避免数据损坏;
    • set -u:防止变量漏定义——比如脚本中误写了变量名(如把BACKUP_DIR写成BACKUP_Dir),会直接报错,而不是用空值执行(比如变成“tar -zcf  /syslog”,导致备份失败);
    • set -o pipefail:补充管道命令防护——比如“command1 | command2”,默认只有command2失败才视为管道失败,开启后command1失败也会触发脚本退出(比如“cat 日志.txt | grep 错误”,如果日志文件不存在导致cat失败,脚本会及时退出)。
    小贴士:如果脚本中某一步命令允许失败(比如“检查旧备份是否存在”),可以在命令后加: || true 临时绕过set -e的限制,例如:find $BACKUP_DIR -name "*.tar.gz" -mtime +7 || true

    技巧2:关键操作留下“日志脚印”——打造专业级日志系统

    入门脚本常用echo输出信息,但echo的缺点很明显:没有时间戳、没有级别区分(信息/错误)、无法持久化存储。专业的脚本日志,需要满足“可追溯、易区分、能审计”的要求,推荐用“函数封装+文件持久化+控制台输出”的方式实现。
    专业日志函数实现:
    #!/bin/bash# 日志文件路径(建议放在/var/log下,需确保脚本有写入权限)LOG_FILE="/var/log/my_script.log"# 获取脚本名称(用于日志标识,区分多个脚本的日志)SCRIPT_NAME=$(basename "$0")# 日志输出函数:支持级别区分、时间戳、文件+控制台双输出log_message() {    local level=$1          # 日志级别:INFO/WARNING/ERROR    local message=$2        # 日志内容    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")  # 精确到秒的时间戳    # 1. 写入日志文件(持久化存储,用于后续回溯)    echo "[$timestamp] [$level$SCRIPT_NAME$message" >> "$LOG_FILE"    # 2. 同时输出到控制台(交互式运行时,方便实时查看)    if [ -t 0 ]; then        # 可选:给不同级别日志加颜色(红色=错误,黄色=警告,绿色=信息)        case $level in            "INFO") color="\033[32m" ;;    # 绿色            "WARNING") color="\033[33m" ;; # 黄色            "ERROR") color="\033[31m" ;;   # 红色            *) color="\033[0m" ;;          # 默认(无颜色)        esac        # 输出带颜色的日志,最后重置颜色        echo -e "${color}[$level$message\033[0m"    fi}# 日志使用示例log_message "INFO" "脚本开始执行,准备进行系统日志备份"log_message "WARNING" "备份目录空间不足500MB,可能影响备份完整性"log_message "ERROR" "备份源目录/var/log不存在,创建中..."
    进阶优化点:
    • 日志轮转:如果脚本高频执行,建议给日志文件配置logrotate(Linux系统自带工具),避免日志文件过大(比如设置保留7天日志,单个文件超过100MB自动切割);
    • 错误重定向:将脚本执行中产生的标准错误(stderr)也定向到日志文件,避免遗漏命令自带的错误信息,可在脚本入口加:exec 2>> "$LOG_FILE";
    • 敏感信息过滤:如果日志中可能包含密码、密钥等敏感信息,需在输出前过滤(比如用sed替换敏感字段)。

    技巧3:异常时自动“打扫战场”——用trap命令清理现场”

    脚本执行中可能因各种原因中断(比如Ctrl+C强制停止、系统重启、脚本执行出错退出),此时容易留下临时文件、锁定文件等“垃圾”,导致后续脚本无法正常运行(比如锁定文件未删除,下次执行提示“脚本正在运行”)。
    用trap命令可以捕获脚本的退出信号,无论脚本是正常结束还是异常中断,都会执行预设的清理操作。
    清理机制实现:
    #!/bin/bash# 引入前面定义的日志函数(确保log_message可调用)LOG_FILE="/var/log/my_script.log"SCRIPT_NAME=$(basename "$0")log_message() {    # 此处省略日志函数实现,同技巧2}# 定义清理函数:脚本退出时执行的操作cleanup() {    log_message "INFO" "开始执行清理操作..."    # 1. 删除临时文件(比如脚本执行中生成的临时日志、缓存文件)    rm -f /tmp/temp_*.txt /tmp/backup_cache.dat    # 2. 删除锁定文件(避免下次执行被误判为“正在运行”)    rm -f /var/lock/my_script.lock    # 3. 其他清理:比如关闭打开的文件描述符、终止子进程等    # pkill -P $$  # 终止当前脚本的所有子进程(按需使用)    log_message "INFO" "清理操作完成,脚本退出"}# 捕获退出信号:让cleanup函数在脚本退出时执行# EXIT:正常退出信号;INT:Ctrl+C强制停止信号;TERM:kill命令触发的信号trap cleanup EXIT INT TERM# 脚本主逻辑(示例:创建锁定文件,避免并发执行)if [ -f /var/lock/my_script.lock ]; then    log_message "ERROR" "脚本已在运行中(检测到锁定文件),退出执行"    exit 1else    touch /var/lock/my_script.lock    log_message "INFO" "创建锁定文件成功,开始执行主逻辑"fi# 此处省略脚本主逻辑(如备份、数据处理等)
    注意:清理函数要“简单可靠”,避免在清理过程中再抛出错误(比如不要用可能失败的命令),否则会覆盖原始的错误信息,增加排查难度。

    三、实操:升级版日志备份脚本(整合三大技巧)

    下面我们把上次的基础备份脚本,整合前面的“错误防护、日志记录、清理机制”,打造一个生产级的日志备份脚本。这个脚本具备以下能力:
    • 异常立即止损(set -euo pipefail);
    • 全流程日志记录(含时间戳、级别、脚本名称);
    • 自动清理临时文件和锁定文件;
    • 磁盘空间检查(避免因空间不足导致备份失败);
    • 备份重试机制(失败后自动重试,提高成功率);
    • 旧备份清理(保留指定天数的备份,节省磁盘空间)。

    升级版备份脚本完整代码:

    #!/bin/bash# ==== 1. 错误防护设置(脚本开头优先配置)====set -euo pipefail# 开启错误输出重定向:将标准错误定向到日志文件exec 2>> "$LOG_FILE"# ==== 2. 配置参数(集中管理,方便后续修改)====BACKUP_DIR="/backup/logs"    # 备份文件存储目录LOG_DIR="/var/log"           # 待备份的日志目录LOG_FILE="/var/log/backup_script.log"  # 脚本日志文件RETENTION_DAYS=7             # 旧备份保留天数(超过7天的自动删除)MAX_RETRIES=3                # 备份失败后的最大重试次数REQUIRED_SPACE=1024          # 备份所需最小磁盘空间(单位:MB,即1GB)LOCK_FILE="/var/lock/backup_script.lock"  # 锁定文件路径# ==== 3. 日志函数(带颜色区分)====log_message() {    local level=$1    local message=$2    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")    # 写入日志文件    echo "[$timestamp] [$level$(basename "$0")$message" >> "$LOG_FILE"    # 带颜色输出到控制台(交互式运行时)    if [ -t 0 ]; then        case $level in            "INFO") color="\033[32m" ;;            "WARNING") color="\033[33m" ;;            "ERROR") color="\033[31m" ;;            *) color="\033[0m" ;;        esac        echo -e "${color}[$level$message\033[0m"    fi}# ==== 4. 清理函数(脚本退出时执行)====cleanup() {    # 只清理存在的锁定文件(避免rm -f报错)    if [[ -f "$LOCK_FILE" ]]; then        rm -f "$LOCK_FILE"        log_message "INFO" "已删除锁定文件:$LOCK_FILE"    fi    # 删除备份过程中产生的临时文件    rm -f /tmp/backup_temp_*.tar.gz    log_message "INFO" "清理操作完成"}# ==== 5. 辅助检查函数====# 检查磁盘空间是否充足check_disk_space() {    log_message "INFO" "开始检查备份目录磁盘空间"    # 获取备份目录所在磁盘的可用空间(单位:MB)    # df -m:以MB为单位显示磁盘空间;awk 'NR==2 {print $4}':提取第二行的第4列(可用空间)    local available_space=$(df -m "$BACKUP_DIR" | awk 'NR==2 {print $4}')    # 比较可用空间与所需空间(注意:此处用-eq/-lt等,需确保变量为数字)    if [[ $available_space -lt $REQUIRED_SPACE ]]; then        log_message "ERROR" "磁盘空间不足!备份目录$BACKUP_DIR可用空间:${available_space}MB,所需空间:${REQUIRED_SPACE}MB"        exit 1  # 空间不足,直接退出    fi    log_message "INFO" "磁盘空间检查通过,可用空间:${available_space}MB"}# ==== 6. 主逻辑函数====main() {    # 步骤1:设置清理机制    trap cleanup EXIT INT TERM    # 步骤2:检查是否并发执行(通过锁定文件)    if [[ -f "$LOCK_FILE" ]]; then        log_message "ERROR" "检测到锁定文件$LOCK_FILE,脚本已在运行中,退出执行"        exit 1    else        touch "$LOCK_FILE"        log_message "INFO" "创建锁定文件$LOCK_FILE成功"    fi    # 步骤3:检查备份目录是否存在,不存在则创建    if [[ ! -d "$BACKUP_DIR" ]]; then        log_message "WARNING" "备份目录$BACKUP_DIR不存在,开始创建"        mkdir -p "$BACKUP_DIR"        log_message "INFO" "备份目录$BACKUP_DIR创建成功"    fi    # 步骤4:检查磁盘空间    check_disk_space    # 步骤5:生成备份文件名(含时间戳,避免重复)    local date_stamp=$(date +%Y%m%d_%H%M%S)    local backup_file="syslog_backup_${date_stamp}.tar.gz"    local full_path="$BACKUP_DIR/$backup_file"    # 步骤6:带重试机制的备份操作    local retry_count=0    local backup_success=false    log_message "INFO" "开始执行日志备份,最大重试次数:$MAX_RETRIES"    while [[ $retry_count -lt $MAX_RETRIES && $backup_success == false ]]; do        ((retry_count++))        log_message "INFO" "第${retry_count}次备份尝试:备份$LOG_DIR/syslog到$full_path"        # 执行备份命令(tar -zcf:压缩打包;-C:指定源目录;--exclude:排除不需要备份的文件)        if tar -zcf "$full_path" -C "$LOG_DIR" syslog --exclude="syslog.*.gz"then            backup_success=true            # 输出备份文件大小(方便审计)            local backup_size=$(du -h "$full_path" | cut -f1)            log_message "INFO" "第${retry_count}次备份成功,备份文件:$full_path,大小:$backup_size"        else            log_message "WARNING" "第${retry_count}次备份失败"            # 失败后删除不完整的备份文件            rm -f "$full_path"            # 重试间隔2秒(避免频繁重试)            sleep 2        fi    done    # 步骤7:判断备份是否成功    if [[ $backup_success == false ]]; then        log_message "ERROR" "备份失败,已达最大重试次数($MAX_RETRIES)"        exit 1    fi    # 步骤8:清理旧备份(删除超过RETENTION_DAYS天的备份文件)    log_message "INFO" "开始清理${RETENTION_DAYS}天前的旧备份文件"    # find命令:-mtime +7:最后修改时间超过7天;-delete:删除符合条件的文件;-print:打印删除的文件(用于计数)    local deleted_count=$(find "$BACKUP_DIR" -name "syslog_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete -print | wc -l)    log_message "INFO" "旧备份清理完成,共删除${deleted_count}个旧备份文件"}# ==== 7. 脚本入口(启动主逻辑)====log_message "INFO" "=== 系统日志备份脚本开始执行 ==="mainlog_message "INFO" "=== 系统日志备份脚本执行完成 ==="
    脚本使用说明:
    • 权限配置:给脚本添加执行权限:chmod +x backup_syslog.sh;
    • 测试运行:先开启调试模式(取消脚本开头的set -x注释),手动运行测试:./backup_syslog.sh;
    • 定时执行:测试通过后,用crontab设置定时任务(比如每天凌晨3点执行):0 3 * * * /path/to/backup_syslog.sh;
    • 日志查看:通过日志文件监控执行情况 tail -f /var/log/backup_script.log

    四、调试技巧:快速定位脚本问题

    即使脚本加了错误处理和日志,也可能遇到问题。掌握以下3个调试技巧,能快速定位问题根源:
    • 逐行调试:不需要修改脚本,直接用bash -x运行脚本,会显示每一条执行的命令和变量值,相当于“脚本执行过程录像”
      适合:排查变量赋值错误、命令参数错误、逻辑流程错误。
    • 语法检查(提前避坑):用shellcheck工具自动检查脚本的常见语法错误(如变量未定义、括号不匹配、命令拼写错误等)。
    # 工具需安装# Debian/Ubuntu :sudo apt install shellcheck# CentOS/RHEL sudo yum install shellcheck()# Mac osbrew install shellcheck# 运行使用:shellcheck 你的脚本
    • 局部调试(精准定位):如果只怀疑脚本中某一段代码有问题,不需要全局开启调试模式,可在怀疑的代码段前后添加set -x(开启调试)和set +x(关闭调试),只输出该段的执行过程。
    #  示例:log_message "INFO" "开始执行备份逻辑"set -x  # 开启局部调试tar -zcf "$full_path" -C "$LOG_DIR" syslogset +x  # 关闭局部调试log_message "INFO" "备份逻辑执行完成"

    五、进阶学习路线(持续提升)

    掌握了错误处理、日志记录和清理机制,你已经超越了80%的入门级Shell脚本开发者。接下来可以按以下路线继续进阶:

      • Shell脚本安全:学习如何防止命令注入(比如处理用户输入时的安全过滤)、安全处理密码和密钥(避免明文存储)、最小权限原则(脚本用普通用户执行,而非root);
      • Shell与外部交互:学习用curl调用API、用jq工具解析JSON数据(比如从API返回结果中提取信息)、脚本参数解析(用getopts或getopt处理命令行参数);
      • 脚本工程化:将Shell脚本集成到CI/CD流水线(如Jenkins、GitLab CI),实现脚本的版本控制、自动化测试和批量部署,适配大规模集群环境。
      好的Shell脚本不是一次写成的,而是通过不断迭代优化(解决实际问题、补充防护机制)逐步完善的。从今天起,给你写的每一个脚本都加上错误处理、日志记录和清理机制——三个月后再回头看,你会发现自己的脚本不仅“能跑”,还能在生产环境中“稳稳当当”,而你也会从“脚本编写者”成长为“自动化运维工程师”。

      最新文章

      随机文章

      基本 文件 流程 错误 SQL 调试
      1. 请求信息 : 2026-02-08 17:57:43 HTTP/2.0 GET : https://f.mffb.com.cn/a/464453.html
      2. 运行时间 : 0.265393s [ 吞吐率:3.77req/s ] 内存消耗:4,886.49kb 文件加载:140
      3. 缓存信息 : 0 reads,0 writes
      4. 会话信息 : SESSION_ID=cf346301850eeb2761a398af290e1fc4
      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.000842s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
      2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001578s ]
      3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002475s ]
      4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000659s ]
      5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001356s ]
      6. SELECT * FROM `set` [ RunTime:0.001495s ]
      7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001451s ]
      8. SELECT * FROM `article` WHERE `id` = 464453 LIMIT 1 [ RunTime:0.002204s ]
      9. UPDATE `article` SET `lasttime` = 1770544663 WHERE `id` = 464453 [ RunTime:0.012366s ]
      10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000720s ]
      11. SELECT * FROM `article` WHERE `id` < 464453 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003875s ]
      12. SELECT * FROM `article` WHERE `id` > 464453 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001563s ]
      13. SELECT * FROM `article` WHERE `id` < 464453 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.007047s ]
      14. SELECT * FROM `article` WHERE `id` < 464453 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.025837s ]
      15. SELECT * FROM `article` WHERE `id` < 464453 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.030891s ]
      0.271342s