# PHP 服务连接问题解决方案 ## 问题描述 Python 后端无法连接到 PHP 服务,报错: ``` HTTPConnectionPool(host='192.168.1.164', port=30100): Read timed out ``` ## 已完成的修复 ### 1. 配置修正 - ✅ 修改 `lover/deps.py`:移除硬编码 IP,从配置读取 - ✅ 修改 `lover/config.py`:默认地址改为 `127.0.0.1:30100` - ✅ 修改 `.env`:端口从 `8080` 改为 `30100` - ✅ 减少超时时间:从 5 秒改为 3 秒 - ✅ 改进错误处理:区分超时和连接错误 ### 2. 启动脚本优化 - ✅ 使用 `router.php` 而不是 `-t .` - ✅ 添加端口清理逻辑,自动终止占用端口的旧进程 - ✅ 添加等待时间,确保服务完全启动 ### 3. 测试工具 创建了 `xunifriend_RaeeC/public/test_api.php` 用于测试: - `/test_api.php` - 测试 PHP 服务器基本响应 - `/test_db` - 测试数据库连接 ## 当前问题分析 ### PHP 服务器状态 ``` 端口 30100 已被监听(进程 31592, 16636) 但是请求超时,无法获得响应 ``` ### 可能的原因 1. **数据库连接问题** - PHP 应用可能在启动时尝试连接数据库 - 如果数据库连接失败或慢,会导致请求超时 - 检查 `xunifriend_RaeeC/application/database.php` 配置 2. **PHP 内置服务器限制** - PHP 内置服务器是单线程的 - 如果有请求阻塞,后续请求会超时 - 建议使用 Apache 或 Nginx + PHP-FPM 3. **应用初始化问题** - ThinkPHP 框架初始化可能有问题 - 检查 `xunifriend_RaeeC/application/admin/command/Install/install.lock` 是否存在 4. **路由配置问题** - API 路由可能未正确配置 - 检查 `xunifriend_RaeeC/application/route.php` ## 解决步骤 ### 步骤 1: 测试 PHP 服务器基本功能 ```cmd # 在浏览器或命令行测试 curl http://127.0.0.1:30100/test_api.php ``` 预期响应: ```json { "code": 1, "msg": "PHP 服务器运行正常", "time": 1738665600, "data": { "php_version": "8.0.0", "server_time": "2026-02-04 19:00:00" } } ``` ### 步骤 2: 测试数据库连接 ```cmd curl http://127.0.0.1:30100/test_db ``` 如果数据库连接失败,检查: - MySQL 是否运行 - `xunifriend_RaeeC/application/database.php` 配置是否正确 - 数据库用户名密码是否正确 ### 步骤 3: 测试实际 API ```cmd # 使用有效的 token 测试 curl -H "token: YOUR_TOKEN_HERE" http://127.0.0.1:30100/api/user_basic/get_user_basic ``` ### 步骤 4: 检查 PHP 错误日志 PHP 内置服务器的错误会显示在启动窗口中,查看是否有: - 数据库连接错误 - 文件权限错误 - PHP 语法错误 - 缺少扩展 ## 临时解决方案 ### 方案 1: 使用开发环境兜底(已实现) Python 后端在开发环境下,如果 PHP 连接失败,会自动使用测试用户: ```python # 在 lover/deps.py 中 if settings.APP_ENV == "development" and settings.DEBUG: logger.warning(f"开发环境:token 验证失败({e.detail}),使用测试用户") return AuthedUser(id=70, reg_step=2, gender=0, nickname="test-user", token="") ``` ### 方案 2: 直接使用数据库认证 修改 Python 后端,不依赖 PHP API,直接查询数据库: ```python # 在 lover/deps.py 中添加 def _fetch_user_from_db(token: str) -> Optional[dict]: """直接从数据库获取用户信息""" from lover.db import get_db db = next(get_db()) user = db.execute( "SELECT * FROM fa_user WHERE token = :token", {"token": token} ).fetchone() return dict(user) if user else None ``` ### 方案 3: 重启 PHP 服务 ```cmd # 使用更新后的启动脚本,会自动清理旧进程 启动项目.bat ``` ## 长期解决方案 ### 推荐:使用 Nginx + PHP-FPM PHP 内置服务器不适合生产环境,建议: 1. 安装 Nginx 2. 配置 PHP-FPM 3. 配置 Nginx 反向代理 配置示例: ```nginx server { listen 30100; server_name localhost; root C:/Users/Administrator/Desktop/Project/AI_GirlFriend/xunifriend_RaeeC/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ``` ## 调试命令 ### 查看端口占用 ```cmd netstat -ano | findstr :30100 ``` ### 终止进程 ```cmd taskkill /F /PID <进程ID> ``` ### 测试 PHP 配置 ```cmd D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe -v D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe -m # 查看已安装的扩展 ``` ### 手动启动 PHP 服务器(用于调试) ```cmd cd xunifriend_RaeeC\public D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe -S 0.0.0.0:30100 router.php ``` ## 下一步行动 1. **立即测试**:运行 `curl http://127.0.0.1:30100/test_api.php` 2. **检查数据库**:确认 MySQL 正在运行 3. **查看日志**:检查 PHP 启动窗口的错误信息 4. **重启服务**:使用更新后的 `启动项目.bat` ## 文件修改记录 - `lover/deps.py` - 改进错误处理和超时设置 - `lover/config.py` - 修正默认地址 - `.env` - 修正端口配置 - `启动项目.bat` - 添加端口清理和 router.php - `xunifriend_RaeeC/public/test_api.php` - 新增测试脚本