优化
This commit is contained in:
@@ -580,6 +580,13 @@ class TaskSchedulerCommand extends Command
|
||||
// [DEBUG] 记录关闭管道前的状态
|
||||
file_put_contents($logFile, "[DEBUG] 准备关闭管道,输出长度: " . strlen($output) . ", 错误长度: " . strlen($error) . "\n", FILE_APPEND);
|
||||
|
||||
// 在关闭管道前,再次获取进程状态以获取准确的退出码
|
||||
$finalStatus = proc_get_status($process);
|
||||
$exitCodeFromStatus = isset($finalStatus['exitcode']) ? $finalStatus['exitcode'] : null;
|
||||
|
||||
file_put_contents($logFile, "[DEBUG] 关闭管道前的最终状态: " . json_encode($finalStatus, JSON_UNESCAPED_UNICODE) . "\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] proc_get_status 返回的退出码: " . ($exitCodeFromStatus !== null ? $exitCodeFromStatus : 'null') . "\n", FILE_APPEND);
|
||||
|
||||
// 关闭管道
|
||||
$closeResults = [];
|
||||
$closeResults['stdin'] = @fclose($pipes[0]);
|
||||
@@ -588,17 +595,30 @@ class TaskSchedulerCommand extends Command
|
||||
file_put_contents($logFile, "[DEBUG] 管道关闭结果: " . json_encode($closeResults, JSON_UNESCAPED_UNICODE) . "\n", FILE_APPEND);
|
||||
|
||||
// 获取退出码
|
||||
$exitCode = proc_close($process);
|
||||
$exitCodeFromClose = proc_close($process);
|
||||
|
||||
// [DEBUG] 记录退出码获取结果
|
||||
file_put_contents($logFile, "[DEBUG] proc_close 返回的退出码: {$exitCode}\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 退出码类型: " . gettype($exitCode) . "\n", FILE_APPEND);
|
||||
if ($exitCode === -1) {
|
||||
file_put_contents($logFile, "[DEBUG] ⚠️ 退出码为 -1,可能原因:\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 1. 进程被信号终止\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 2. 进程异常终止\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 3. 无法获取进程退出状态\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 4. Windows系统上的特殊返回值\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] proc_close 返回的退出码: {$exitCodeFromClose}\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 退出码类型: " . gettype($exitCodeFromClose) . "\n", FILE_APPEND);
|
||||
|
||||
// 优先使用 proc_get_status 的退出码,因为 proc_close 在某些情况下会错误返回 -1
|
||||
// 如果 proc_get_status 有退出码且进程已结束,使用它;否则使用 proc_close 的返回值
|
||||
if ($exitCodeFromStatus !== null && !$finalStatus['running']) {
|
||||
$exitCode = $exitCodeFromStatus;
|
||||
file_put_contents($logFile, "[DEBUG] ✅ 使用 proc_get_status 的退出码: {$exitCode}\n", FILE_APPEND);
|
||||
if ($exitCodeFromClose === -1 && $exitCode === 0) {
|
||||
file_put_contents($logFile, "[DEBUG] ℹ️ 注意: proc_close 返回 -1,但 proc_get_status 显示退出码为 0,这是 PHP 的已知行为,任务实际执行成功\n", FILE_APPEND);
|
||||
}
|
||||
} else {
|
||||
$exitCode = $exitCodeFromClose;
|
||||
file_put_contents($logFile, "[DEBUG] 使用 proc_close 的退出码: {$exitCode}\n", FILE_APPEND);
|
||||
if ($exitCode === -1) {
|
||||
file_put_contents($logFile, "[DEBUG] ⚠️ 退出码为 -1,可能原因:\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 1. 进程被信号终止\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 2. 进程异常终止\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 3. 无法获取进程退出状态\n", FILE_APPEND);
|
||||
file_put_contents($logFile, "[DEBUG] 4. Windows系统上的特殊返回值\n", FILE_APPEND);
|
||||
}
|
||||
}
|
||||
|
||||
// 记录输出
|
||||
|
||||
Reference in New Issue
Block a user