乐于分享
好东西不私藏

WPF 股票盯盘工具五(附源码):Quartz.NET 定时任务 + 全局异常处理

WPF 股票盯盘工具五(附源码):Quartz.NET 定时任务 + 全局异常处理

前言

盯盘软件的核心循环是什么?每隔几秒,自动刷新行情数据

用 Timer 行不行?行。但 Timer 有几个问题:

  • 定时不精准,两个 Timer 同时触发可能竞争同一个资源

  • 不支持 cron 表达式("每周一到周五9:30到15:00每10秒刷新"这种复杂调度做不了)

  • 异常直接炸进程,没有重试机制

Quartz.NET 是一个成熟的企业级定时任务调度库,支持持久化任务、Job 链、集群模式。本项目用最简单的模式:内存调度,Job 注入 Autofac Service,每2秒刷新一次

这章把 Quartz 集成、三层异常处理、日志架构全部讲透。

一、Quartz.NET 基础概念

概念
说明
Scheduler
调度器,全局唯一,启动后接管所有 Job 的调度
IJob
任务接口,Execute(IJobExecutionContext) 是入口
IJobDetail
Job 的元数据(类型、名称、分组、参数)
ITrigger
触发器,定义执行时机(立即、单次、重复、Cron)
JobDataMap
Job 执行时传入的键值参数
执行流程:
Scheduler.Start()    │    ├──→ Trigger 触发时机到了    │         │    │         └──→ Scheduler 查找对应的 JobDetail    │                   │    │                   └──→ JobExecutionContext 包装执行环境    │                             │    │                             └──→ IJob.Execute(context)    │                                       │    │                                       └──→ 执行业务逻辑    │    └──→ 定时器持续运行,直到 Scheduler.Shutdown()

二、QuartzHelper:调度器封装

// Common/QuartzHelper.cspublic static class QuartzHelper{    private static IScheduler _scheduler;    private static readonly object LockObj = new object();    publicstatic Task InitQuartzAsync()    {        lock (LockObj)        {            if (_scheduler != nullreturn Task.CompletedTask;            return InitSchedulerInternalAsync();        }    }    // 兼容旧同步版本(内部调用异步实现)    [Obsolete("Use InitQuartzAsync instead.")]    publicstaticasyncvoidInitQuartz()    {        try        {            await InitQuartzAsync().ConfigureAwait(false);        }        catch (SchedulerException ex)        {            Logger.LogError(ex, "Quartz initialization failed");        }        catch (Exception ex)        {            Logger.LogCritical(ex, "Quartz unexpected error");        }    }    privatestaticasync Task InitSchedulerInternalAsync()    {        StdSchedulerFactory factory = new StdSchedulerFactory();        _scheduler = await factory.GetScheduler().ConfigureAwait(false);        // 注册两个 Job:自选股刷新 + 大盘指数刷新        IJobDetail stockJob = JobBuilder.Create<TaskGetStockDataJob>()            .WithIdentity("StockJob""StockGroup")            .Build();        IJobDetail stockIndexJob = JobBuilder.Create<TaskGetStockIndexJob>()            .WithIdentity("StockIndexJob""StockGroup2")            .Build();        // 每2秒触发一次,立即开始,永不停止(RepeatForever)        ITrigger stockTrigger = TriggerBuilder.Create()            .WithIdentity("StockTrigger""StockGroup")            .StartNow()            .WithSimpleSchedule(x => x                .WithIntervalInSeconds(2)                .RepeatForever())            .Build();        ITrigger stockIndexTrigger = TriggerBuilder.Create()            .WithIdentity("StockTrigger2""StockGroup2")            .StartNow()            .WithSimpleSchedule(x => x                .WithIntervalInSeconds(2)                .RepeatForever())            .Build();        // 先注册指数(确保指数先刷新,再刷新个股)        await _scheduler.ScheduleJob(stockIndexJob, stockIndexTrigger).ConfigureAwait(false);        await _scheduler.ScheduleJob(stockJob, stockTrigger).ConfigureAwait(false);        await _scheduler.Start().ConfigureAwait(false);        Logger.LogInformation("Quartz scheduler started (interval: 2s)");    }    publicstaticasync Task ShutdownQuartzAsync()    {        lock (LockObj)        {            if (_scheduler == nullreturn;        }        try        {            Logger.LogInformation("Shutting down Quartz...");            await _scheduler.Shutdown(waitForJobsToComplete: true).ConfigureAwait(false);            Logger.LogInformation("Quartz shut down cleanly");        }        catch (Exception ex)        {            Logger.LogError(ex, "Error shutting down Quartz");        }    }}

设计要点:

  1. 双重锁单例_scheduler 只初始化一次,lock 防止并发初始化,Task.CompletedTask 短路已有实例

  2. waitForJobsToComplete: true:关闭时等当前正在运行的 Job 执行完毕再退出,不会截断正在更新的数据

  3. 两个分组(StockGroup / StockGroup2):让指数和个股分开管理,后续可以单独暂停/恢复某一组

三、两个 Job 实现

3.1 TaskGetStockDataJob:自选股刷新

// SchedulerJob/TaskGetStockDataJob.cs[DisallowConcurrentExecution]   // 禁止并发:上一轮没跑完,不启动下一轮public class TaskGetStockDataJob : IJob{    private static readonly ILogger Logger = LoggerHelper.CreateLogger<TaskGetStockDataJob>();    private ViewModelLocator _locator;    public Task Execute(IJobExecutionContext context)    {        try        {            // 懒加载 ViewModelLocator(App 启动时已注册到 Resources)            if (_locator == null)                _locator = Application.Current?.Resources["Locator"as ViewModelLocator;            if (_locator?.Main == null)            {                Logger.LogWarning("Locator not ready, skipping");                return Task.CompletedTask;            }            var list = _locator.Main.StockList;            if (list == null || list.Count == 0return Task.CompletedTask;            var stockService = StockServiceFactory.CreateFactory("qq");            bool hiddenName = _locator.Main.HiddenName;            // ⚠️ 关键:Dispatcher.BeginInvoke,把后台线程的操作投递到 UI 线程            return Application.Current.Dispatcher.BeginInvoke(                DispatcherPriority.Background,                new Action(() => stockService.GetStocksDetail(list, hiddenName))            ).Task;        }        catch (Exception ex)        {            Logger.LogError(ex, "TaskGetStockDataJob unexpected error");            return Task.CompletedTask;  // 吞掉异常,不让 Job 彻底崩溃        }    }}

3.2 TaskGetStockIndexJob:大盘指数刷新

// SchedulerJob/TaskGetStockIndexJob.cs[DisallowConcurrentExecution]public class TaskGetStockIndexJob : IJob{    private static readonly ILogger Logger = LoggerHelper.CreateLogger<TaskGetStockIndexJob>();    private ViewModelLocator _locator;    public Task Execute(IJobExecutionContext context)    {        try        {            if (_locator == null)                _locator = Application.Current?.Resources["Locator"as ViewModelLocator;            if (_locator?.Main == null)            {                Logger.LogWarning("Index Locator not ready, skipping");                return Task.CompletedTask;            }            var list = _locator.Main.StockIndexList;            if (list == null || list.Count == 0return Task.CompletedTask;            var stockService = StockServiceFactory.CreateFactory("qq");            bool hiddenName = _locator.Main.HiddenName;            return Application.Current.Dispatcher.BeginInvoke(                DispatcherPriority.Background,                new Action(() =>                {                    stockService.GetStockIndexDetail(list, hiddenName);                    UpdateStockIndexString(_locator.Main, list);                })            ).Task;        }        catch (Exception ex)        {            Logger.LogError(ex, "TaskGetStockIndexJob unexpected error");            return Task.CompletedTask;        }    }    // 将指数列表拼成一行字符串,显示在底部状态栏    privatestaticvoidUpdateStockIndexString(MainViewModel vm,        ObservableCollection<StockViewMode> list)    {        var sb = new StringBuilder();        foreach (var item in list)        {            sb.Append(item.Name); sb.Append(": ");            sb.Append(item.CurrentPrice); sb.Append(" ");            sb.Append(item.ChangePrice.ToString("f2")); sb.Append(" ");            sb.Append(item.Percent.ToString("P2")); sb.Append(" ");        }        vm.StockIndexString = sb.ToString();    }}

四、三层异常处理架构

这是整个应用稳定性的核心。

┌─────────────────────────────────────────────────────┐│              App.xaml.cs  OnStartup                  ││  ┌──────────────────────────────────────────────┐   ││  │  AppDomain.UnhandledException               │   ││  │  (任何线程未捕获的异常,包括 Quartz Job)    │   ││  │  → Logger.LogCritical → 写日志 → 决定是否退出│   ││  └──────────────────────────────────────────────┘   ││  ┌──────────────────────────────────────────────┐   ││  │  DispatcherUnhandledException               │   ││  │  (UI 线程绑定错误、空指针等)                │   ││  │  → Logger.LogCritical → args.Handled = true  │   ││  └──────────────────────────────────────────────┘   │└─────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────┐│              QuartzHelper                            ││  ┌──────────────────────────────────────────────┐   ││  │  InitQuartz try/catch                        │   ││  │  → Logger.LogError / LogCritical             │   ││  └──────────────────────────────────────────────┘   │└─────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────┐│              TaskGetStockDataJob.Execute             ││  ┌──────────────────────────────────────────────┐   ││  │  try/catch (内层)                            │   ││  │  → Logger.LogError                          │   ││  │  → return Task.CompletedTask; ← 吞异常      │   ││  └──────────────────────────────────────────────┘   │└─────────────────────────────────────────────────────┘

4.1 异常处理详细代码

// App.xaml.csprotectedoverridevoidOnStartup(StartupEventArgs e){    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;    DispatcherUnhandledException += (_, args) =>    {        Logger.LogCritical(args.Exception, "Dispatcher unhandled exception");        args.Handled = true;  // ← 关键:标记已处理,窗口不崩溃    };    base.OnStartup(e);    System.Text.Encoding.RegisterProvider(        System.Text.CodePagesEncodingProvider.Instance);  // GB2312 编码支持    QuartzHelper.InitQuartz();  // 旧同步 API,内部已是 async/await}protectedoverridevoidOnExit(ExitEventArgs e){    try    {        Logger.LogInformation("Shutting down...");        _ = QuartzHelper.ShutdownQuartzAsync();  // fire and forget,退出不阻塞        LoggerHelper.Dispose();    }    catch (Exception ex)    {        System.Diagnostics.Debug.WriteLine($"OnExit error: {ex.Message}");    }    base.OnExit(e);}privatestaticvoidOnUnhandledException(object sender, UnhandledExceptionEventArgs args){    if (args.ExceptionObject is Exception ex)        Logger.LogCritical(ex,            "AppDomain unhandled (terminating: {0})"args.IsTerminating);}

五、LoggerHelper:Microsoft.Extensions.Logging 封装

// Common/LoggerHelper.cspublic static class LoggerHelper{    private static ILoggerFactory _factory;    publicstaticvoidEnsureInitialized()    {        if (_factory != nullreturn;        _factory = LoggerFactory.Create(builder =>        {            builder.SetMinimumLevel(LogLevel.Information);            builder.AddDebug();         // Debug 输出窗口            builder.AddConsole();        // 控制台        });    }    publicstatic ILogger CreateLogger<T>()        => _factory.CreateLogger<T>();    publicstatic ILogger CreateLogger(Type type)        => _factory.CreateLogger(type);}

为什么用 Microsoft.Extensions.Logging

这是 .NET 生态里的标准日志抽象层,主流日志库(NLog、Serilog、log4net)都有 ILogger 的适配器。切换日志实现只需要改 EnsureInitialized 里的配置,不需要动业务代码:

// 切换到 Serilog(示例)_factory = LoggerFactory.Create(builder =>{    builder.AddSerilog(new SerilogLoggerSink配置...);});

六、Quartz 集成 Autofac

Autofac.Extras.Quartz 这个 NuGet 包让 Quartz Job 能自动注入 Service:

// Common/AutoFacHelper.cspublicstatic ContainerBuilder InitAutofac(){    var builder = new ContainerBuilder();    InitDependency(builder);    // 关键:注册 Quartz.Autofac 集成模块    // Job 从容器解析 Service,Service 又是单例 → 所有 Job 共享同一个 Service 实例    builder.RegisterModule(new QuartzAutofacFactoryModule());    return builder;}
这样 Job 就可以直接注入 Service 了(代码里因为直接用 StockServiceFactory.CreateFactory("qq") 没走注入,但理论上可以改成注入 IStockService):
public classTaskGetStockDataJob : IJob{    private readonly IStockService _stockService;  // Autofac 注入    public TaskGetStockDataJob(IStockService stockService)    {        _stockService = stockService;    }}

七、实际运行效果

[INFO] 14:29:30.001 Quartz scheduler started successfully (interval: 2s)[INFO] 14:29:30.101 TaskGetStockIndexJob: refreshed 4 indices[INFO] 14:29:30.102 TaskGetStockDataJob: refreshed 5 stocks[INFO] 14:29:32.002 TaskGetStockIndexJob: refreshed 4 indices[INFO] 14:29:32.102 TaskGetStockDataJob: refreshed 5 stocks[INFO] 14:29:34.003 TaskGetStockIndexJob: refreshed 4 indices[INFO] 14:29:34.104 TaskGetStockDataJob: refreshed 5 stocks...[WARN]  14:30:05.001 HTTP GET failed for http://qt.gtimg.cn/ (timeout)[ERROR] 14:30:05.002 TaskGetStockDataJob unexpected error: HttpRequestException
每一轮刷新日志只有 4 行(4 指数 + 5 自选股),开销极小。HTTP 超时有 HttpHelper 兜底,返回空字符串,服务层 GetStocksDetail 对空结果直接跳过,不影响整体刷新。

八、系列总结

五篇文章覆盖了一个完整 WPF 应用的开发全过程:

主题
核心代码量
关键技术
项目框架 + MVVM 架构
App.xaml / ViewModelLocator
Autofac DI / 无边框窗口 / 三层异常
股票服务层设计
IStockService / QqService / SinaService
模板方法 / 工厂模式 / HttpClient 缓存
K 线自定义控件
StockKline / Fundline
DrawingVisual / MatrixTransform / 中午休市偏移
自选股管理 + 持久化
MainViewModel CRUD
ObservableCollection / Messenger / JSON / NPOI
Quartz 定时任务
TaskGetStockDataJob / TaskGetStockIndexJob
DisallowConcurrent / Dispatcher.BeginInvoke / ILogger
完整项目结构:
OfficeDingPan/├── App.xaml / App.xaml.cs          ← DI 启动 + 全局异常 + Quartz 初始化├── MainWindow.xaml / .cs           ← 主窗体 + Messenger 订阅├── Controls/                        ← DrawingVisual 自定义控件│   ├── StockKline.cs               ← 分时图│   └── Fundline.cs                  ← 资金流├── DataMode/                        ← 数据传输对象├── Model/StockViewMode.cs          ← 视图模型(ViewModelBase├── Service/                        ← 服务层(核心业务逻辑)│   ├── IStockService.cs│   ├── StockServiceBase.cs│   ├── QqStockService.cs           ← 腾讯行情(主力)│   ├── SinaStockService.cs         ← 新浪财经(备用)│   └── StockServiceFactory.cs├── Common/                          ← 工具层│   ├── AutoFacHelper.cs            ← DI 容器 + Quartz 集成│   ├── HttpHelper.cs               ← HttpClient 缓存│   ├── JsonHelper.cs               ← 序列化封装│   ├── FileHelper.cs               ← JSON 文件持久化│   ├── ExcelHepler.cs              ← NPOI Excel 读取│   ├── LoggerHelper.cs             ← ILogger 封装│   └── QuartzHelper.cs             ← 调度器封装├── SchedulerJob/                    ← Quartz Job│   ├── TaskGetStockDataJob.cs      ← 自选股定时刷新│   └── TaskGetStockIndexJob.cs    ← 大盘指数定时刷新├── View/                            ← 窗口│   ├── KLineWindow.xaml / .cs      ← K 线窗体(异步轮询)│   ├── HistoryWindow.xaml / .cs   ← 历史记录│   ├── FundLineWindow.xaml / .cs  ← 资金分析│   ├── HiddenWindow.xaml / .cs    ← 隐藏盯盘│   └── AboutWindow.xaml / .cs     ← 关于├── ViewModel/                       ← ViewModel 层│   ├── MainViewModel.cs            ← 主窗体逻辑(CRUD + 命令)│   ├── HistoryViewModel.cs         ← 历史记录逻辑│   └── ViewModelLocator.cs         ← DI 容器解析├── Skins/                           ← 样式资源│   ├── MainSkin.xaml│   └── ButtonStyle.xaml├── Interface/IDependency.cs         ← DI 标记接口├── Converters/ForeColorConverter.cs ← 涨跌幅颜色转换└── Enums/EnumStockType.cs          ← 股票类型枚举
技术栈清单:
框架       .NET 8.0-windows + WPFMVVM       MVVM LightViewModelBase / RelayCommand / MessengerDI         Autofac + Autofac.Extras.QuartzHTTP       HttpClient(静态字典缓存)+ Referer 伪装K线绘制    DrawingVisual + DrawingContext + MatrixTransform定时任务   Quartz.NET(2s 间隔,DisallowConcurrentExcel      NPOIJSON       Newtonsoft.Json日志       Microsoft.Extensions.LoggingConsole + Debug持久化     JSON 文件(系统临时目录)
从框架到数据,从绘图到任务,从持久化到日志监控——这套架构在 .NET 桌面应用里是标准的生产级写法,改一改需求(比如换成天气、换成物流追踪),核心框架完全不用动。
本期所有内容到此为止,后续如有改动再向合集中继续追加。
附项目源码:
链接: https://v.v8l.cn/s/rFDawR3 提取码: h5fn
如有其他问题,请留言
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-11 01:14:24 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/921406.html
  2. 运行时间 : 0.164726s [ 吞吐率:6.07req/s ] 内存消耗:4,825.77kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=582b1239eeeccc1b4042623e461ac73f
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 4.22 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.11 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000987s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001435s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000692s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000630s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001308s ]
  6. SELECT * FROM `set` [ RunTime:0.000561s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001473s ]
  8. SELECT * FROM `article` WHERE `id` = 921406 LIMIT 1 [ RunTime:0.001183s ]
  9. UPDATE `article` SET `lasttime` = 1786382064 WHERE `id` = 921406 [ RunTime:0.010230s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000670s ]
  11. SELECT * FROM `article` WHERE `id` < 921406 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001167s ]
  12. SELECT * FROM `article` WHERE `id` > 921406 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001209s ]
  13. SELECT * FROM `article` WHERE `id` < 921406 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.007797s ]
  14. SELECT * FROM `article` WHERE `id` < 921406 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002091s ]
  15. SELECT * FROM `article` WHERE `id` < 921406 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.012924s ]
0.170488s