fix swoole timer stuck

This commit is contained in:
crazywhalecc 2023-02-10 19:13:24 +08:00
parent dfe4613eac
commit 52030e8db3
No known key found for this signature in database
GPG Key ID: 1F4BDD59391F2680
2 changed files with 17 additions and 1 deletions

View File

@ -109,7 +109,8 @@ class WorkerEventListener
}
// Windows 系统的 CtrlC 由于和 Select 有一定的冲突,如果没事件解析的话 CtrlC 会阻塞,所以必须添加一个空的计时器
if (PHP_OS_FAMILY === 'Windows') {
Framework::getInstance()->getDriver()->getEventLoop()->addTimer(1000, function () {}, 0);
Framework::getInstance()->getDriver()->getEventLoop()->addTimer(1000, function () {
}, 0);
}
// 回显 debug 日志:进程占用的内存
$memory_total = memory_get_usage() / 1024 / 1024;
@ -121,6 +122,14 @@ class WorkerEventListener
logger()->debug('{is_task}Worker 进程 #{id} 已启动', ['is_task' => ProcessStateManager::isTaskWorker() ? 'Task' : '', 'id' => ProcessManager::getProcessId()]);
}
public function onWorkerExit(): void
{
// 清除计时器
Framework::getInstance()->getDriver()->getEventLoop()->clearAllTimer();
$worker_id = ProcessManager::getProcessId();
logger()->notice('正在结束 Worker #' . $worker_id . ' 中的任务...');
}
/**
* @throws ZMKnownException
* @throws \JsonException
@ -132,6 +141,11 @@ class WorkerEventListener
}
logger()->debug('{is_task}Worker 进程 #{id} 正在停止', ['is_task' => ProcessStateManager::isTaskWorker() ? 'Task' : '', 'id' => ProcessManager::getProcessId()]);
if (Framework::getInstance()->getDriver()->getName() !== 'swoole') {
logger()->debug('清除计时器中');
Framework::getInstance()->getDriver()->getEventLoop()->clearAllTimer();
}
if (DIRECTORY_SEPARATOR !== '\\') {
ProcessStateManager::removeProcessState(ProcessStateManager::isTaskWorker() ? ZM_PROCESS_TASKWORKER : ZM_PROCESS_WORKER, ProcessManager::getProcessId());
}

View File

@ -9,6 +9,7 @@ use OneBot\Driver\Event\DriverInitEvent;
use OneBot\Driver\Event\Http\HttpRequestEvent;
use OneBot\Driver\Event\Process\ManagerStartEvent;
use OneBot\Driver\Event\Process\ManagerStopEvent;
use OneBot\Driver\Event\Process\WorkerExitEvent;
use OneBot\Driver\Event\Process\WorkerStartEvent;
use OneBot\Driver\Event\Process\WorkerStopEvent;
use OneBot\Driver\Event\WebSocket\WebSocketCloseEvent;
@ -235,6 +236,7 @@ class Framework
ob_event_provider()->addEventListener(WorkerStartEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerStart1'], 1);
ob_event_provider()->addEventListener(WorkerStopEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerStop999'], 999);
ob_event_provider()->addEventListener(WorkerStopEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerStop1'], 1);
ob_event_provider()->addEventListener(WorkerExitEvent::getName(), [WorkerEventListener::getInstance(), 'onWorkerExit'], 999);
// Http 事件
ob_event_provider()->addEventListener(HttpRequestEvent::getName(), [HttpEventListener::getInstance(), 'onRequest999'], 999);
ob_event_provider()->addEventListener(HttpRequestEvent::getName(), [HttpEventListener::getInstance(), 'onRequest1'], 1);