签入版本

This commit is contained in:
2026-10-08 21:09:24 +08:00
parent 846cdb601f
commit 40a263ce22
14 changed files with 46 additions and 20 deletions
@@ -154,12 +154,18 @@ Content-Type: application/json
| 验证码过期/不存在 | 1 | 验证码错误 | | 验证码过期/不存在 | 1 | 验证码错误 |
| 验证码不匹配 | 1 | 验证码错误 | | 验证码不匹配 | 1 | 验证码错误 |
| 获取频率超限 | 1 | 请求过于频繁,请 N 秒后重试 | | 获取频率超限 | 1 | 请求过于频繁,请 N 秒后重试 |
| Redis 未连接(密码错误/服务未启) | 1 | 缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试 |
| 验证码生成的其它异常 | 1 | 验证码生成失败,请稍后重试 |
| 未配置验证码长度(=0) | — | 跳过验证码校验(仅调试用途) | | 未配置验证码长度(=0) | — | 跳过验证码校验(仅调试用途) |
:::tip 验证码错误统一提示 :::tip 验证码错误统一提示
无论验证码是过期、不存在还是不匹配,统一提示"验证码错误",不暴露具体原因,防止攻击者探测。 无论验证码是过期、不存在还是不匹配,统一提示"验证码错误",不暴露具体原因,防止攻击者探测。
::: :::
:::tip Redis 不可用的检测与提示
生成验证码写入 Redis 失败时,会再执行一次 `PING` 复检(同样走地址、端口、密码鉴权):连接确实不通才返回「缓存服务(Redis)连接失败…」这条可操作的提示,其余情况返回通用提示;真实错误(如密码不匹配、连接拒绝)记录在日志 `验证码写入 Redis 失败` 中。
:::
### Redis 存储结构 ### Redis 存储结构
```text ```text
@@ -375,7 +381,7 @@ CAPTCHA_NOISE_DOTS=300
| 现象 | 原因 | 处理 | | 现象 | 原因 | 处理 |
|------|------|------| |------|------|------|
| 验证码接口 500 | Redis 未连接 / phpredis 扩展缺失 | 见 [2.2 Laragon 环境搭建](/zh/quickstart/laragon.html) Redis 章节 | | 验证码接口返回「缓存服务(Redis)连接失败…」 | Redis 未连接 / 密码不匹配 / phpredis 扩展缺失 | 见 [2.2 Laragon 环境搭建](/zh/quickstart/laragon.html) Redis 章节 |
| 图片显示空白 | 字体文件缺失 | 确认 `public/static/fonts/Vera.ttf` 存在 | | 图片显示空白 | 字体文件缺失 | 确认 `public/static/fonts/Vera.ttf` 存在 |
| 一直提示验证码错误 | 前端传参名错误 | 必须是 `key` / `code`(非 captchaKey/captchaCode) | | 一直提示验证码错误 | 前端传参名错误 | 必须是 `key` / `code`(非 captchaKey/captchaCode) |
| 频繁提示"请求过于频繁" | 同 IP 短时间多次获取 | 等待窗口期结束,或调整 `CAPTCHA_RATE_LIMIT` | | 频繁提示"请求过于频繁" | 同 IP 短时间多次获取 | 等待窗口期结束,或调整 `CAPTCHA_RATE_LIMIT` |
@@ -54,7 +54,7 @@
## 软件出处 ## 软件出处
+ 软件名称:RXThinkCMF前后端分离Laravel13+AntDesign版本 + 软件名称:RXThinkCMF前后端分离Laravel13+ElementPlus版本
+ 软件作者:@小蚂蚁云团队 + 软件作者:@小蚂蚁云团队
+ 软件协议:Apache-2.0 + 软件协议:Apache-2.0
+ 官网网址:[https://www.rxthink.cn](https://www.rxthink.cn) + 官网网址:[https://www.rxthink.cn](https://www.rxthink.cn)
@@ -130,6 +130,10 @@
<td><img src="/demo/27.png"/></td> <td><img src="/demo/27.png"/></td>
<td><img src="/demo/28.png"/></td> <td><img src="/demo/28.png"/></td>
</tr> </tr>
<tr>
<td><img src="/demo/29.png"/></td>
<td><img src="/demo/30.png"/></td>
</tr>
</tbody> </tbody>
</table> </table>
@@ -205,7 +205,7 @@ const menus = await getMenuList();
// menus = [{id:1, name:'控制面板', path:'/dashboard', children:[...]}] // menus = [{id:1, name:'控制面板', path:'/dashboard', children:[...]}]
// 修改密码(成功后前端需清除令牌重新登录 —— 后端已全端吊销) // 修改密码(成功后前端需清除令牌重新登录 —— 后端已全端吊销)
await updatePassword({ oldPassword: '123456', newPassword: '654321' }); await updatePassword({ password: '123456', newPassword: '654321', confirmPassword: '654321' });
// 更新个人信息 // 更新个人信息
await updateProfile({ realname: '张三', mobile: '13800138000' }); await updateProfile({ realname: '张三', mobile: '13800138000' });
@@ -240,9 +240,9 @@ lsof -i :8000
php artisan serve --port=8080 php artisan serve --port=8080
``` ```
### 6. 验证码接口报"验证码服务不可用" ### 6. 验证码接口报"缓存服务(Redis)连接失败"
Redis 未启动或密码不匹配(`.env` 中 `REDIS_PASSWORD` 与 Redis 实际 `requirepass` 不一致)。验证: Redis 未启动或密码不匹配(`.env` 中 `REDIS_PASSWORD` 与 Redis 实际 `requirepass` 不一致),接口返回「缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试」,真实原因见日志 `验证码写入 Redis 失败`。验证:
```bash ```bash
redis-cli ping # 输出 PONG redis-cli ping # 输出 PONG
@@ -230,7 +230,7 @@ netstat -an | findstr ":6379" # 应看到 127.0.0.1:6379 LIS
### 设置密码(实际踩坑记录) ### 设置密码(实际踩坑记录)
:::warning :::warning
Redis 无密码直连可用;一旦在 Redis 侧设置了 `requirepass` 而 `.env` 未同步,Laravel 所有 Redis 操作(验证码、JWT 会话、限流)会全部失败,且 CaptchaService 的 catch 会把真实错误吞掉,只报「验证码生成失败 / 验证码服务不可用」。 Redis 无密码直连可用;一旦 Redis 侧设置了 `requirepass` 而 `.env` 未同步(或 `.env` 配了 `REDIS_PASSWORD` 而 Redis 侧没设密码),Laravel 所有 Redis 操作(验证码、JWT 会话、限流)会全部失败。验证码接口此时返回「缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试」,真实错误(如 `ERR AUTH ...`)记录在日志 `验证码写入 Redis 失败` 中。
::: :::
处理步骤(缺一不可): 处理步骤(缺一不可):
@@ -281,7 +281,7 @@ $PHP_HOME\php.exe artisan tinker --execute="try { \Illuminate\Support\Facades\Re
|------|------|------| |------|------|------|
| `/` 正常,`/api/*` 返回 Apache 原生 HTML 404 | vhost 缺 `<Directory>` 块,`.htaccess` 被忽略 | 补 `AllowOverride All` 块,`httpd -t` 后重启 Apache | | `/` 正常,`/api/*` 返回 Apache 原生 HTML 404 | vhost 缺 `<Directory>` 块,`.htaccess` 被忽略 | 补 `AllowOverride All` 块,`httpd -t` 后重启 Apache |
| `Class "Redis" not found` | PHP 缺 redis 扩展 | 装 `php_redis.dll` + `php.ini` 加 `extension=redis` | | `Class "Redis" not found` | PHP 缺 redis 扩展 | 装 `php_redis.dll` + `php.ini` 加 `extension=redis` |
| 验证码生成失败 / 服务不可用 | Redis 密码不匹配或服务未启(日志里真实错误被 catch 吞掉) | `.env` 配 `REDIS_PASSWORD`,tinker 单测 Redis 连通 | | 验证码接口返回「缓存服务(Redis)连接失败…」 | Redis 密码不匹配或服务未启 | 日志搜 `验证码写入 Redis 失败` 看真实错误;`.env` 配 `REDIS_PASSWORD`,tinker 单测 Redis 连通 |
| artisan/pint 报 requires PHP >= 8.3 | shell PATH 的 php 是旧版 | 用 `$PHP_HOME\php.exe` 完整路径调用 | | artisan/pint 报 requires PHP >= 8.3 | shell PATH 的 php 是旧版 | 用 `$PHP_HOME\php.exe` 完整路径调用 |
| `httpd -k restart` 报 No installed service | Apache 未注册 Windows 服务 | `taskkill` 后重新启动 `httpd.exe` | | `httpd -k restart` 报 No installed service | Apache 未注册 Windows 服务 | `taskkill` 后重新启动 `httpd.exe` |
| 改了配置 / 扩展不生效 | mod_php 常驻不热加载 | 必须重启 Apache | | 改了配置 / 扩展不生效 | mod_php 常驻不热加载 | 必须重启 Apache |
@@ -154,12 +154,18 @@ Content-Type: application/json
| 验证码过期/不存在 | 1 | 验证码错误 | | 验证码过期/不存在 | 1 | 验证码错误 |
| 验证码不匹配 | 1 | 验证码错误 | | 验证码不匹配 | 1 | 验证码错误 |
| 获取频率超限 | 1 | 请求过于频繁,请 N 秒后重试 | | 获取频率超限 | 1 | 请求过于频繁,请 N 秒后重试 |
| Redis 未连接(密码错误/服务未启) | 1 | 缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试 |
| 验证码生成的其它异常 | 1 | 验证码生成失败,请稍后重试 |
| 未配置验证码长度(=0) | — | 跳过验证码校验(仅调试用途) | | 未配置验证码长度(=0) | — | 跳过验证码校验(仅调试用途) |
:::tip 验证码错误统一提示 :::tip 验证码错误统一提示
无论验证码是过期、不存在还是不匹配,统一提示"验证码错误",不暴露具体原因,防止攻击者探测。 无论验证码是过期、不存在还是不匹配,统一提示"验证码错误",不暴露具体原因,防止攻击者探测。
::: :::
:::tip Redis 不可用的检测与提示
生成验证码写入 Redis 失败时,会再执行一次 `PING` 复检(同样走地址、端口、密码鉴权):连接确实不通才返回「缓存服务(Redis)连接失败…」这条可操作的提示,其余情况返回通用提示;真实错误(如密码不匹配、连接拒绝)记录在日志 `验证码写入 Redis 失败` 中。
:::
### Redis 存储结构 ### Redis 存储结构
```text ```text
@@ -375,7 +381,7 @@ CAPTCHA_NOISE_DOTS=300
| 现象 | 原因 | 处理 | | 现象 | 原因 | 处理 |
|------|------|------| |------|------|------|
| 验证码接口 500 | Redis 未连接 / phpredis 扩展缺失 | 见 [2.2 Laragon 环境搭建](/zh/quickstart/laragon.html) Redis 章节 | | 验证码接口返回「缓存服务(Redis)连接失败…」 | Redis 未连接 / 密码不匹配 / phpredis 扩展缺失 | 见 [2.2 Laragon 环境搭建](/zh/quickstart/laragon.html) Redis 章节 |
| 图片显示空白 | 字体文件缺失 | 确认 `public/static/fonts/Vera.ttf` 存在 | | 图片显示空白 | 字体文件缺失 | 确认 `public/static/fonts/Vera.ttf` 存在 |
| 一直提示验证码错误 | 前端传参名错误 | 必须是 `key` / `code`(非 captchaKey/captchaCode) | | 一直提示验证码错误 | 前端传参名错误 | 必须是 `key` / `code`(非 captchaKey/captchaCode) |
| 频繁提示"请求过于频繁" | 同 IP 短时间多次获取 | 等待窗口期结束,或调整 `CAPTCHA_RATE_LIMIT` | | 频繁提示"请求过于频繁" | 同 IP 短时间多次获取 | 等待窗口期结束,或调整 `CAPTCHA_RATE_LIMIT` |
@@ -205,7 +205,7 @@ const menus = await getMenuList();
// menus = [{id:1, name:'控制面板', path:'/dashboard', children:[...]}] // menus = [{id:1, name:'控制面板', path:'/dashboard', children:[...]}]
// 修改密码(成功后前端需清除令牌重新登录 —— 后端已全端吊销) // 修改密码(成功后前端需清除令牌重新登录 —— 后端已全端吊销)
await updatePassword({ oldPassword: '123456', newPassword: '654321' }); await updatePassword({ password: '123456', newPassword: '654321', confirmPassword: '654321' });
// 更新个人信息 // 更新个人信息
await updateProfile({ realname: '张三', mobile: '13800138000' }); await updateProfile({ realname: '张三', mobile: '13800138000' });
@@ -240,9 +240,9 @@ lsof -i :8000
php artisan serve --port=8080 php artisan serve --port=8080
``` ```
### 6. 验证码接口报"验证码服务不可用" ### 6. 验证码接口报"缓存服务(Redis)连接失败"
Redis 未启动或密码不匹配(`.env` 中 `REDIS_PASSWORD` 与 Redis 实际 `requirepass` 不一致)。验证: Redis 未启动或密码不匹配(`.env` 中 `REDIS_PASSWORD` 与 Redis 实际 `requirepass` 不一致),接口返回「缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试」,真实原因见日志 `验证码写入 Redis 失败`。验证:
```bash ```bash
redis-cli ping # 输出 PONG redis-cli ping # 输出 PONG
@@ -230,7 +230,7 @@ netstat -an | findstr ":6379" # 应看到 127.0.0.1:6379 LIS
### 设置密码(实际踩坑记录) ### 设置密码(实际踩坑记录)
:::warning :::warning
Redis 无密码直连可用;一旦在 Redis 侧设置了 `requirepass` 而 `.env` 未同步,Laravel 所有 Redis 操作(验证码、JWT 会话、限流)会全部失败,且 CaptchaService 的 catch 会把真实错误吞掉,只报「验证码生成失败 / 验证码服务不可用」。 Redis 无密码直连可用;一旦 Redis 侧设置了 `requirepass` 而 `.env` 未同步(或 `.env` 配了 `REDIS_PASSWORD` 而 Redis 侧没设密码),Laravel 所有 Redis 操作(验证码、JWT 会话、限流)会全部失败。验证码接口此时返回「缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试」,真实错误(如 `ERR AUTH ...`)记录在日志 `验证码写入 Redis 失败` 中。
::: :::
处理步骤(缺一不可): 处理步骤(缺一不可):
@@ -281,7 +281,7 @@ $PHP_HOME\php.exe artisan tinker --execute="try { \Illuminate\Support\Facades\Re
|------|------|------| |------|------|------|
| `/` 正常,`/api/*` 返回 Apache 原生 HTML 404 | vhost 缺 `<Directory>` 块,`.htaccess` 被忽略 | 补 `AllowOverride All` 块,`httpd -t` 后重启 Apache | | `/` 正常,`/api/*` 返回 Apache 原生 HTML 404 | vhost 缺 `<Directory>` 块,`.htaccess` 被忽略 | 补 `AllowOverride All` 块,`httpd -t` 后重启 Apache |
| `Class "Redis" not found` | PHP 缺 redis 扩展 | 装 `php_redis.dll` + `php.ini` 加 `extension=redis` | | `Class "Redis" not found` | PHP 缺 redis 扩展 | 装 `php_redis.dll` + `php.ini` 加 `extension=redis` |
| 验证码生成失败 / 服务不可用 | Redis 密码不匹配或服务未启(日志里真实错误被 catch 吞掉) | `.env` 配 `REDIS_PASSWORD`,tinker 单测 Redis 连通 | | 验证码接口返回「缓存服务(Redis)连接失败…」 | Redis 密码不匹配或服务未启 | 日志搜 `验证码写入 Redis 失败` 看真实错误;`.env` 配 `REDIS_PASSWORD`,tinker 单测 Redis 连通 |
| artisan/pint 报 requires PHP >= 8.3 | shell PATH 的 php 是旧版 | 用 `$PHP_HOME\php.exe` 完整路径调用 | | artisan/pint 报 requires PHP >= 8.3 | shell PATH 的 php 是旧版 | 用 `$PHP_HOME\php.exe` 完整路径调用 |
| `httpd -k restart` 报 No installed service | Apache 未注册 Windows 服务 | `taskkill` 后重新启动 `httpd.exe` | | `httpd -k restart` 报 No installed service | Apache 未注册 Windows 服务 | `taskkill` 后重新启动 `httpd.exe` |
| 改了配置 / 扩展不生效 | mod_php 常驻不热加载 | 必须重启 Apache | | 改了配置 / 扩展不生效 | mod_php 常驻不热加载 | 必须重启 Apache |
@@ -154,12 +154,18 @@ Content-Type: application/json
| 验证码过期/不存在 | 1 | 验证码错误 | | 验证码过期/不存在 | 1 | 验证码错误 |
| 验证码不匹配 | 1 | 验证码错误 | | 验证码不匹配 | 1 | 验证码错误 |
| 获取频率超限 | 1 | 请求过于频繁,请 N 秒后重试 | | 获取频率超限 | 1 | 请求过于频繁,请 N 秒后重试 |
| Redis 未连接(密码错误/服务未启) | 1 | 缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试 |
| 验证码生成的其它异常 | 1 | 验证码生成失败,请稍后重试 |
| 未配置验证码长度(=0) | — | 跳过验证码校验(仅调试用途) | | 未配置验证码长度(=0) | — | 跳过验证码校验(仅调试用途) |
:::tip 验证码错误统一提示 :::tip 验证码错误统一提示
无论验证码是过期、不存在还是不匹配,统一提示"验证码错误",不暴露具体原因,防止攻击者探测。 无论验证码是过期、不存在还是不匹配,统一提示"验证码错误",不暴露具体原因,防止攻击者探测。
::: :::
:::tip Redis 不可用的检测与提示
生成验证码写入 Redis 失败时,会再执行一次 `PING` 复检(同样走地址、端口、密码鉴权):连接确实不通才返回「缓存服务(Redis)连接失败…」这条可操作的提示,其余情况返回通用提示;真实错误(如密码不匹配、连接拒绝)记录在日志 `验证码写入 Redis 失败` 中。
:::
### Redis 存储结构 ### Redis 存储结构
```text ```text
@@ -375,7 +381,7 @@ CAPTCHA_NOISE_DOTS=300
| 现象 | 原因 | 处理 | | 现象 | 原因 | 处理 |
|------|------|------| |------|------|------|
| 验证码接口 500 | Redis 未连接 / phpredis 扩展缺失 | 见 [2.2 Laragon 环境搭建](/zh/quickstart/laragon.html) Redis 章节 | | 验证码接口返回「缓存服务(Redis)连接失败…」 | Redis 未连接 / 密码不匹配 / phpredis 扩展缺失 | 见 [2.2 Laragon 环境搭建](/zh/quickstart/laragon.html) Redis 章节 |
| 图片显示空白 | 字体文件缺失 | 确认 `public/static/fonts/Vera.ttf` 存在 | | 图片显示空白 | 字体文件缺失 | 确认 `public/static/fonts/Vera.ttf` 存在 |
| 一直提示验证码错误 | 前端传参名错误 | 必须是 `key` / `code`(非 captchaKey/captchaCode) | | 一直提示验证码错误 | 前端传参名错误 | 必须是 `key` / `code`(非 captchaKey/captchaCode) |
| 频繁提示"请求过于频繁" | 同 IP 短时间多次获取 | 等待窗口期结束,或调整 `CAPTCHA_RATE_LIMIT` | | 频繁提示"请求过于频繁" | 同 IP 短时间多次获取 | 等待窗口期结束,或调整 `CAPTCHA_RATE_LIMIT` |
@@ -54,7 +54,7 @@
## 软件出处 ## 软件出处
+ 软件名称:RXThinkCMF前后端分离Laravel13+NaiveUI版本 + 软件名称:RXThinkCMF前后端分离Laravel13+ElementPlus版本
+ 软件作者:@小蚂蚁云团队 + 软件作者:@小蚂蚁云团队
+ 软件协议:Apache-2.0 + 软件协议:Apache-2.0
+ 官网网址:[https://www.rxthink.cn](https://www.rxthink.cn) + 官网网址:[https://www.rxthink.cn](https://www.rxthink.cn)
@@ -130,6 +130,10 @@
<td><img src="/demo/27.png"/></td> <td><img src="/demo/27.png"/></td>
<td><img src="/demo/28.png"/></td> <td><img src="/demo/28.png"/></td>
</tr> </tr>
<tr>
<td><img src="/demo/29.png"/></td>
<td><img src="/demo/30.png"/></td>
</tr>
</tbody> </tbody>
</table> </table>
@@ -205,7 +205,7 @@ const menus = await getMenuList();
// menus = [{id:1, name:'控制面板', path:'/dashboard', children:[...]}] // menus = [{id:1, name:'控制面板', path:'/dashboard', children:[...]}]
// 修改密码(成功后前端需清除令牌重新登录 —— 后端已全端吊销) // 修改密码(成功后前端需清除令牌重新登录 —— 后端已全端吊销)
await updatePassword({ oldPassword: '123456', newPassword: '654321' }); await updatePassword({ password: '123456', newPassword: '654321', confirmPassword: '654321' });
// 更新个人信息 // 更新个人信息
await updateProfile({ realname: '张三', mobile: '13800138000' }); await updateProfile({ realname: '张三', mobile: '13800138000' });
@@ -240,9 +240,9 @@ lsof -i :8000
php artisan serve --port=8080 php artisan serve --port=8080
``` ```
### 6. 验证码接口报"验证码服务不可用" ### 6. 验证码接口报"缓存服务(Redis)连接失败"
Redis 未启动或密码不匹配(`.env` 中 `REDIS_PASSWORD` 与 Redis 实际 `requirepass` 不一致)。验证: Redis 未启动或密码不匹配(`.env` 中 `REDIS_PASSWORD` 与 Redis 实际 `requirepass` 不一致),接口返回「缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试」,真实原因见日志 `验证码写入 Redis 失败`。验证:
```bash ```bash
redis-cli ping # 输出 PONG redis-cli ping # 输出 PONG
@@ -230,7 +230,7 @@ netstat -an | findstr ":6379" # 应看到 127.0.0.1:6379 LIS
### 设置密码(实际踩坑记录) ### 设置密码(实际踩坑记录)
:::warning :::warning
Redis 无密码直连可用;一旦在 Redis 侧设置了 `requirepass` 而 `.env` 未同步,Laravel 所有 Redis 操作(验证码、JWT 会话、限流)会全部失败,且 CaptchaService 的 catch 会把真实错误吞掉,只报「验证码生成失败 / 验证码服务不可用」。 Redis 无密码直连可用;一旦 Redis 侧设置了 `requirepass` 而 `.env` 未同步(或 `.env` 配了 `REDIS_PASSWORD` 而 Redis 侧没设密码),Laravel 所有 Redis 操作(验证码、JWT 会话、限流)会全部失败。验证码接口此时返回「缓存服务(Redis)连接失败,请检查 Redis 配置(地址、端口、密码)后重试」,真实错误(如 `ERR AUTH ...`)记录在日志 `验证码写入 Redis 失败` 中。
::: :::
处理步骤(缺一不可): 处理步骤(缺一不可):
@@ -281,7 +281,7 @@ $PHP_HOME\php.exe artisan tinker --execute="try { \Illuminate\Support\Facades\Re
|------|------|------| |------|------|------|
| `/` 正常,`/api/*` 返回 Apache 原生 HTML 404 | vhost 缺 `<Directory>` 块,`.htaccess` 被忽略 | 补 `AllowOverride All` 块,`httpd -t` 后重启 Apache | | `/` 正常,`/api/*` 返回 Apache 原生 HTML 404 | vhost 缺 `<Directory>` 块,`.htaccess` 被忽略 | 补 `AllowOverride All` 块,`httpd -t` 后重启 Apache |
| `Class "Redis" not found` | PHP 缺 redis 扩展 | 装 `php_redis.dll` + `php.ini` 加 `extension=redis` | | `Class "Redis" not found` | PHP 缺 redis 扩展 | 装 `php_redis.dll` + `php.ini` 加 `extension=redis` |
| 验证码生成失败 / 服务不可用 | Redis 密码不匹配或服务未启(日志里真实错误被 catch 吞掉) | `.env` 配 `REDIS_PASSWORD`,tinker 单测 Redis 连通 | | 验证码接口返回「缓存服务(Redis)连接失败…」 | Redis 密码不匹配或服务未启 | 日志搜 `验证码写入 Redis 失败` 看真实错误;`.env` 配 `REDIS_PASSWORD`,tinker 单测 Redis 连通 |
| artisan/pint 报 requires PHP >= 8.3 | shell PATH 的 php 是旧版 | 用 `$PHP_HOME\php.exe` 完整路径调用 | | artisan/pint 报 requires PHP >= 8.3 | shell PATH 的 php 是旧版 | 用 `$PHP_HOME\php.exe` 完整路径调用 |
| `httpd -k restart` 报 No installed service | Apache 未注册 Windows 服务 | `taskkill` 后重新启动 `httpd.exe` | | `httpd -k restart` 报 No installed service | Apache 未注册 Windows 服务 | `taskkill` 后重新启动 `httpd.exe` |
| 改了配置 / 扩展不生效 | mod_php 常驻不热加载 | 必须重启 Apache | | 改了配置 / 扩展不生效 | mod_php 常驻不热加载 | 必须重启 Apache |