From 0a7301f39df518c037ca8b676245f618b498e69c Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Sat, 24 Jan 2026 17:57:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E8=BF=9B=E7=A8=8B=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0Windows=E5=B9=B3=E5=8F=B0=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改数据库维护子进程和父进程的信号处理逻辑,增加对Windows平台的兼容性检查。在Windows平台下跳过不支持的POSIX函数调用,避免运行时错误。 --- src/ws_server.php | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/ws_server.php b/src/ws_server.php index ce8cf8d1e..3c867d5bd 100644 --- a/src/ws_server.php +++ b/src/ws_server.php @@ -479,9 +479,17 @@ if (extension_loaded('pcntl')) { // 每30秒检查一次数据库连接 $checkInterval = 30; // 秒 - // 保存父进程PID - $parentPid = getppid(); - ws_echo("[数据库维护子进程] 父进程PID: {$parentPid}"); + // 检查是否在Windows平台 + $isWindows = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + + // 保存父进程PID(仅在非Windows平台) + $parentPid = null; + if (!$isWindows && function_exists('getppid')) { + $parentPid = getppid(); + ws_echo("[数据库维护子进程] 父进程PID: {$parentPid}"); + } else { + ws_echo("[数据库维护子进程] 运行在Windows平台,跳过父进程PID检查"); + } // 设置子进程的信号处理 pcntl_signal(SIGTERM, function() { @@ -493,11 +501,13 @@ if (extension_loaded('pcntl')) { // 检查是否有信号需要处理 pcntl_signal_dispatch(); - // 检查父进程是否仍然存在 - $currentParentPid = getppid(); - if ($currentParentPid === 1) { - ws_echo("[数据库维护子进程] 父进程已退出,正在退出..."); - exit(0); + // 检查父进程是否仍然存在(仅在非Windows平台) + if (!$isWindows && function_exists('getppid')) { + $currentParentPid = getppid(); + if ($currentParentPid === 1) { + ws_echo("[数据库维护子进程] 父进程已退出,正在退出..."); + exit(0); + } } try { @@ -526,16 +536,23 @@ if (extension_loaded('pcntl')) { // 父进程:记录子进程PID并设置信号处理 $dbMaintenancePid = $pid; + // 检查是否在Windows平台 + $isWindows = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + // 设置父进程的信号处理 - pcntl_signal(SIGINT, function() use ($dbMaintenancePid) { + pcntl_signal(SIGINT, function() use ($dbMaintenancePid, $isWindows) { ws_echo("[WebSocket服务器] 收到终止信号,正在停止..."); // 如果子进程存在,发送终止信号 if ($dbMaintenancePid) { ws_echo("[WebSocket服务器] 停止数据库连接维护进程"); - posix_kill($dbMaintenancePid, SIGTERM); - // 等待子进程退出 - pcntl_wait($status); + if (!$isWindows && function_exists('posix_kill')) { + posix_kill($dbMaintenancePid, SIGTERM); + // 等待子进程退出 + pcntl_wait($status); + } else { + ws_echo("[WebSocket服务器] 运行在Windows平台,跳过子进程终止信号发送"); + } } ws_echo("[WebSocket服务器] 已停止");