作者 zed

优化日志写入

@@ -9,6 +9,7 @@ class StreamLogger @@ -9,6 +9,7 @@ class StreamLogger
9 protected int $flushSize = 50; // 缓冲条数 9 protected int $flushSize = 50; // 缓冲条数
10 protected int $flushInterval = 1000; // 最长缓存时间(毫秒) 10 protected int $flushInterval = 1000; // 最长缓存时间(毫秒)
11 protected array $lastWrite = []; // 每个 channel 上次写盘时间戳(毫秒) 11 protected array $lastWrite = []; // 每个 channel 上次写盘时间戳(毫秒)
  12 + protected bool $timerCreated = false; // 是否已创建定时器
12 13
13 public function __construct(string $basePath = null) 14 public function __construct(string $basePath = null)
14 { 15 {
@@ -23,14 +24,35 @@ class StreamLogger @@ -23,14 +24,35 @@ class StreamLogger
23 if (!is_dir($this->basePath)) { 24 if (!is_dir($this->basePath)) {
24 mkdir($this->basePath, 0777, true); 25 mkdir($this->basePath, 0777, true);
25 } 26 }
  27 + // 自动延迟启动(防止主程序部分服务未完成初始化。)
  28 + $this->bootTickSafely();
  29 + }
  30 + protected function bootTickSafely()
  31 + {
  32 + // 如果已经创建,避免重复
  33 + if (!empty($this->timerCreated)) {
  34 + return;
  35 + }
  36 + $this->timerCreated = true;
  37 +
  38 + // 如果已经在协程环境 → 直接创建 tick
  39 + if (\Swoole\Coroutine::getCid() > 0) {
  40 + $this->startTick();
  41 + return;
  42 + }
26 43
27 - // 启动定时器(仅 Swoole 环境有效)  
28 - if (class_exists(\Swoole\Timer::class)) { 44 + // 不在协程 → 用 defer 延迟到协程环境创建后
  45 + \Swoole\Coroutine::defer(function () {
  46 + $this->startTick();
  47 + });
  48 + }
  49 +
  50 + protected function startTick()
  51 + {
29 \Swoole\Timer::tick(1000, function () { 52 \Swoole\Timer::tick(1000, function () {
30 $this->flushByInterval(); 53 $this->flushByInterval();
31 }); 54 });
32 } 55 }
33 - }  
34 56
35 public function log($channel, $content): void 57 public function log($channel, $content): void
36 { 58 {