fix(进程管理): 添加Windows平台兼容性处理
修改数据库维护子进程和父进程的信号处理逻辑,增加对Windows平台的兼容性检查。在Windows平台下跳过不支持的POSIX函数调用,避免运行时错误。
This commit is contained in:
@@ -479,9 +479,17 @@ if (extension_loaded('pcntl')) {
|
|||||||
// 每30秒检查一次数据库连接
|
// 每30秒检查一次数据库连接
|
||||||
$checkInterval = 30; // 秒
|
$checkInterval = 30; // 秒
|
||||||
|
|
||||||
// 保存父进程PID
|
// 检查是否在Windows平台
|
||||||
$parentPid = getppid();
|
$isWindows = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
|
||||||
ws_echo("[数据库维护子进程] 父进程PID: {$parentPid}");
|
|
||||||
|
// 保存父进程PID(仅在非Windows平台)
|
||||||
|
$parentPid = null;
|
||||||
|
if (!$isWindows && function_exists('getppid')) {
|
||||||
|
$parentPid = getppid();
|
||||||
|
ws_echo("[数据库维护子进程] 父进程PID: {$parentPid}");
|
||||||
|
} else {
|
||||||
|
ws_echo("[数据库维护子进程] 运行在Windows平台,跳过父进程PID检查");
|
||||||
|
}
|
||||||
|
|
||||||
// 设置子进程的信号处理
|
// 设置子进程的信号处理
|
||||||
pcntl_signal(SIGTERM, function() {
|
pcntl_signal(SIGTERM, function() {
|
||||||
@@ -493,11 +501,13 @@ if (extension_loaded('pcntl')) {
|
|||||||
// 检查是否有信号需要处理
|
// 检查是否有信号需要处理
|
||||||
pcntl_signal_dispatch();
|
pcntl_signal_dispatch();
|
||||||
|
|
||||||
// 检查父进程是否仍然存在
|
// 检查父进程是否仍然存在(仅在非Windows平台)
|
||||||
$currentParentPid = getppid();
|
if (!$isWindows && function_exists('getppid')) {
|
||||||
if ($currentParentPid === 1) {
|
$currentParentPid = getppid();
|
||||||
ws_echo("[数据库维护子进程] 父进程已退出,正在退出...");
|
if ($currentParentPid === 1) {
|
||||||
exit(0);
|
ws_echo("[数据库维护子进程] 父进程已退出,正在退出...");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -526,16 +536,23 @@ if (extension_loaded('pcntl')) {
|
|||||||
// 父进程:记录子进程PID并设置信号处理
|
// 父进程:记录子进程PID并设置信号处理
|
||||||
$dbMaintenancePid = $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服务器] 收到终止信号,正在停止...");
|
ws_echo("[WebSocket服务器] 收到终止信号,正在停止...");
|
||||||
|
|
||||||
// 如果子进程存在,发送终止信号
|
// 如果子进程存在,发送终止信号
|
||||||
if ($dbMaintenancePid) {
|
if ($dbMaintenancePid) {
|
||||||
ws_echo("[WebSocket服务器] 停止数据库连接维护进程");
|
ws_echo("[WebSocket服务器] 停止数据库连接维护进程");
|
||||||
posix_kill($dbMaintenancePid, SIGTERM);
|
if (!$isWindows && function_exists('posix_kill')) {
|
||||||
// 等待子进程退出
|
posix_kill($dbMaintenancePid, SIGTERM);
|
||||||
pcntl_wait($status);
|
// 等待子进程退出
|
||||||
|
pcntl_wait($status);
|
||||||
|
} else {
|
||||||
|
ws_echo("[WebSocket服务器] 运行在Windows平台,跳过子进程终止信号发送");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ws_echo("[WebSocket服务器] 已停止");
|
ws_echo("[WebSocket服务器] 已停止");
|
||||||
|
|||||||
Reference in New Issue
Block a user