225 lines
5.2 KiB
Markdown
225 lines
5.2 KiB
Markdown
|
|
# PHP 服务器超时问题解决
|
|||
|
|
|
|||
|
|
## 🔍 问题诊断结果
|
|||
|
|
|
|||
|
|
### 发现的问题
|
|||
|
|
|
|||
|
|
1. **多个 PHP 进程同时运行**
|
|||
|
|
- 发现 2 个 PHP 进程(PID: 14076, 22776)
|
|||
|
|
- 都在监听 30100 端口
|
|||
|
|
- 导致端口冲突和资源竞争
|
|||
|
|
|
|||
|
|
2. **大量半关闭连接**
|
|||
|
|
- 多个 `CLOSE_WAIT` 状态的连接
|
|||
|
|
- 多个 `FIN_WAIT_2` 状态的连接
|
|||
|
|
- 说明连接没有正常关闭,资源耗尽
|
|||
|
|
|
|||
|
|
3. **Python 也有多个进程**
|
|||
|
|
- 发现 2 个 Python 进程(PID: 12040, 19024)
|
|||
|
|
- 可能是之前启动失败后没有清理
|
|||
|
|
|
|||
|
|
### 根本原因
|
|||
|
|
|
|||
|
|
**重复启动服务导致的端口冲突和资源耗尽:**
|
|||
|
|
- 多次运行启动脚本
|
|||
|
|
- 旧进程没有正确关闭
|
|||
|
|
- 新进程无法正常工作
|
|||
|
|
- 连接堆积导致超时
|
|||
|
|
|
|||
|
|
## ✅ 已执行的修复
|
|||
|
|
|
|||
|
|
已经停止了所有旧的进程:
|
|||
|
|
```powershell
|
|||
|
|
Stop-Process -Id 14076,22776 -Force # PHP 进程
|
|||
|
|
Stop-Process -Id 12040,19024 -Force # Python 进程
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
端口已完全释放,可以重新启动服务。
|
|||
|
|
|
|||
|
|
## 🚀 正确的启动流程
|
|||
|
|
|
|||
|
|
### 方法 1:使用启动脚本(推荐)
|
|||
|
|
|
|||
|
|
**启动脚本会自动清理旧进程:**
|
|||
|
|
|
|||
|
|
1. 双击运行 `启动项目.bat`
|
|||
|
|
2. 脚本会自动:
|
|||
|
|
- 检查并终止占用端口的旧进程
|
|||
|
|
- 等待端口释放
|
|||
|
|
- 启动 PHP 服务器(30100)
|
|||
|
|
- 启动 Python 服务器(30101)
|
|||
|
|
|
|||
|
|
### 方法 2:手动启动
|
|||
|
|
|
|||
|
|
**如果需要手动启动:**
|
|||
|
|
|
|||
|
|
1. **先清理旧进程:**
|
|||
|
|
```powershell
|
|||
|
|
# 查找占用端口的进程
|
|||
|
|
netstat -ano | Select-String ":30100"
|
|||
|
|
netstat -ano | Select-String ":30101"
|
|||
|
|
|
|||
|
|
# 停止进程(替换为实际的 PID)
|
|||
|
|
Stop-Process -Id <PID> -Force
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **启动 PHP 服务器:**
|
|||
|
|
```cmd
|
|||
|
|
cd xunifriend_RaeeC\public
|
|||
|
|
php -S 0.0.0.0:30100 router.php
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **启动 Python 服务器:**
|
|||
|
|
```cmd
|
|||
|
|
python -m uvicorn lover.main:app --host 0.0.0.0 --port 30101 --reload
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔧 避免问题的最佳实践
|
|||
|
|
|
|||
|
|
### 1. 启动前检查
|
|||
|
|
|
|||
|
|
**每次启动前先检查端口:**
|
|||
|
|
```powershell
|
|||
|
|
netstat -ano | Select-String ":30100"
|
|||
|
|
netstat -ano | Select-String ":30101"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如果有输出,说明端口被占用,需要先停止旧进程。
|
|||
|
|
|
|||
|
|
### 2. 正确停止服务
|
|||
|
|
|
|||
|
|
**不要直接关闭窗口,而是:**
|
|||
|
|
- 在服务器窗口中按 `Ctrl+C`
|
|||
|
|
- 等待服务正常退出
|
|||
|
|
- 或者使用任务管理器结束进程
|
|||
|
|
|
|||
|
|
### 3. 使用启动脚本
|
|||
|
|
|
|||
|
|
**启动脚本的优势:**
|
|||
|
|
- 自动检测并清理旧进程
|
|||
|
|
- 自动等待端口释放
|
|||
|
|
- 在独立窗口中运行,便于查看日志
|
|||
|
|
- 出错时容易定位问题
|
|||
|
|
|
|||
|
|
### 4. 定期清理
|
|||
|
|
|
|||
|
|
**如果遇到问题,可以手动清理:**
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 停止所有 PHP 进程
|
|||
|
|
Get-Process | Where-Object {$_.ProcessName -eq "php"} | Stop-Process -Force
|
|||
|
|
|
|||
|
|
# 停止所有 Python 进程(注意:会停止所有 Python 程序)
|
|||
|
|
Get-Process | Where-Object {$_.ProcessName -eq "python"} | Stop-Process -Force
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 验证服务是否正常
|
|||
|
|
|
|||
|
|
### 1. 检查进程
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 应该只有 1 个 PHP 进程
|
|||
|
|
Get-Process | Where-Object {$_.ProcessName -eq "php"}
|
|||
|
|
|
|||
|
|
# 应该只有 1 个 Python 进程(或 2 个,如果有其他 Python 程序)
|
|||
|
|
Get-Process | Where-Object {$_.ProcessName -eq "python"}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 检查端口
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 应该只有 1 个 LISTENING 状态
|
|||
|
|
netstat -ano | Select-String ":30100" | Select-String "LISTENING"
|
|||
|
|
netstat -ano | Select-String ":30101" | Select-String "LISTENING"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 测试访问
|
|||
|
|
|
|||
|
|
**PHP 服务器:**
|
|||
|
|
```
|
|||
|
|
http://127.0.0.1:30100/test_api.php
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Python 服务器:**
|
|||
|
|
```
|
|||
|
|
http://127.0.0.1:30101/docs
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🐛 常见问题
|
|||
|
|
|
|||
|
|
### 问题 1:启动脚本无法清理旧进程
|
|||
|
|
|
|||
|
|
**症状:**
|
|||
|
|
- 启动脚本运行后还是有多个进程
|
|||
|
|
- 端口还是被占用
|
|||
|
|
|
|||
|
|
**解决:**
|
|||
|
|
手动停止所有进程:
|
|||
|
|
```powershell
|
|||
|
|
Get-Process | Where-Object {$_.ProcessName -eq "php"} | Stop-Process -Force
|
|||
|
|
Get-Process | Where-Object {$_.ProcessName -eq "python"} | Stop-Process -Force
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题 2:PHP 服务器启动后立即退出
|
|||
|
|
|
|||
|
|
**症状:**
|
|||
|
|
- PHP 窗口一闪而过
|
|||
|
|
- 端口没有被监听
|
|||
|
|
|
|||
|
|
**可能原因:**
|
|||
|
|
- PHP 路径配置错误
|
|||
|
|
- router.php 文件不存在
|
|||
|
|
- 端口被其他程序占用
|
|||
|
|
|
|||
|
|
**解决:**
|
|||
|
|
1. 检查 `启动项目.bat` 中的 `PHP_PATH` 配置
|
|||
|
|
2. 确认 `xunifriend_RaeeC\public\router.php` 存在
|
|||
|
|
3. 尝试手动启动查看错误信息
|
|||
|
|
|
|||
|
|
### 问题 3:Python 服务器无法连接 PHP
|
|||
|
|
|
|||
|
|
**症状:**
|
|||
|
|
- Python 日志显示 "请求超时"
|
|||
|
|
- PHP 服务器正常运行
|
|||
|
|
|
|||
|
|
**可能原因:**
|
|||
|
|
- PHP 服务器响应慢
|
|||
|
|
- 防火墙阻止本地连接
|
|||
|
|
- PHP 代码有错误
|
|||
|
|
|
|||
|
|
**解决:**
|
|||
|
|
1. 在浏览器中测试 PHP 接口:
|
|||
|
|
```
|
|||
|
|
http://127.0.0.1:30100/api/user_basic/get_user_basic
|
|||
|
|
```
|
|||
|
|
2. 查看 PHP 服务器窗口的错误日志
|
|||
|
|
3. 检查 PHP 代码是否有语法错误
|
|||
|
|
|
|||
|
|
## 📝 下一步
|
|||
|
|
|
|||
|
|
现在所有旧进程已清理,请:
|
|||
|
|
|
|||
|
|
1. **重新启动服务:**
|
|||
|
|
- 双击运行 `启动项目.bat`
|
|||
|
|
- 或者手动启动 PHP 和 Python 服务器
|
|||
|
|
|
|||
|
|
2. **验证服务正常:**
|
|||
|
|
- 访问 http://127.0.0.1:30100
|
|||
|
|
- 访问 http://127.0.0.1:30101/docs
|
|||
|
|
|
|||
|
|
3. **测试语音通话:**
|
|||
|
|
- 打开 App
|
|||
|
|
- 进入语音通话页面
|
|||
|
|
- 测试功能
|
|||
|
|
|
|||
|
|
4. **观察日志:**
|
|||
|
|
- 不应该再有 "请求超时" 错误
|
|||
|
|
- 应该能正常获取用户信息
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**问题:** PHP 服务器超时
|
|||
|
|
**原因:** 多个进程同时运行,端口冲突,连接堆积
|
|||
|
|
**解决:** 停止所有旧进程,重新启动
|
|||
|
|
**状态:** ✅ 已清理,可以重新启动
|