#!/usr/bin/env php getMessage() . ' @ ' . $e->getFile() . ':' . $e->getLine(); } if (empty($errors)) { foreach (config('process', []) as $name => $proc) { $handler = $proc['handler'] ?? ''; if (is_string($handler) && $handler !== '' && !class_exists($handler)) { $errors[] = "进程 [{$name}] 处理器不存在: {$handler}"; } } } if (empty($errors)) { try { support\think\Db::execute('SELECT 1'); } catch (Throwable $e) { $errors[] = '数据库连接失败: ' . $e->getMessage(); } } $listen = config('process.webman.listen', ''); if ($listen !== '' && empty($errors)) { $parsed = parse_url($listen); $host = $parsed['host'] ?? '0.0.0.0'; $port = $parsed['port'] ?? 80; $bindHost = $host === '0.0.0.0' ? '127.0.0.1' : $host; $sock = @stream_socket_server("tcp://{$bindHost}:{$port}", $errno, $errstr); if ($sock === false) { $errors[] = "端口 {$port} 无法监听: [{$errno}] {$errstr}"; $errors[] = "可执行: ss -lntp | grep {$port} 查看是否被占用"; } else { fclose($sock); } } if ($errors) { echo "=== 启动自检失败 ===\n"; foreach ($errors as $i => $msg) { echo ($i + 1) . '. ' . $msg . "\n"; } echo "\n下一步:\n"; echo " php start.php start # 前台启动看完整报错\n"; echo " tail -n 80 runtime/logs/workerman.log\n"; echo " tail -n 80 runtime/logs/stdout.log\n"; exit(1); } echo "=== 启动自检通过 ===\n"; echo "监听: {$listen}\n"; echo "Worker 数: " . (config('process.webman.count') ?? '?') . "\n"; echo "路由数: " . count(Webman\Route::getRoutes()) . "\n"; echo "\n请执行: php start.php start\n"; echo "确认无误后再: php start.php start -d\n"; exit(0);