根因(两处叠加):
1) public/admin.php 缺失:FastAdmin 的 deny_module_list 含 admin,
后台必须通过 admin.php 以 BIND_MODULE=admin 访问 → 之前任何 /admin 都 404
2) PHP 8.5 将 (boolean) 列为编译期 E_DEPRECATED,TP5 Request.php:1159 命中
→ Error::appError 升级为 ErrorException,在 Request 类「自动加载」瞬间抛出,
早于任何模块级垫片,导致请求直接中断
修复:
- 新增 public/admin.php(标准 FastAdmin 入口,BIND_MODULE=admin)
- thinkphp/library/think/Request.php:1159 (boolean) → (bool),已备份
并固化为可复现脚本 scripts/patch_tp_php85.sh
- application/admin/common.php 与 application/index/common.php 增加 PHP8 兼容垫片
(application/common.php 不会被 TP5 自动加载,已还原为原样)
- nginx 伪静态新增 /admin、/admin/ → /admin.php(已备份 + nginx -t + 平滑 reload)
验证:/admin → 302 登录页、/admin.php/index/login → 200;
后台密码哈希与 DB 一致;验证码 /captcha 返回 PNG;163 项断言回归全通过
39 行
1.4 KiB
Bash
39 行
1.4 KiB
Bash
#!/bin/bash
|
||
# =============================================================================
|
||
# ThinkPHP 5.0 / PHP 8.5 兼容补丁
|
||
#
|
||
# 背景:PHP 8.5 将「非规范布尔强制转换 (boolean)」列为编译期 E_DEPRECATED。
|
||
# think\Error::appError() 会把它升级为 ErrorException,
|
||
# 而该告警发生在 Request 类「被自动加载(编译)」的瞬间,
|
||
# 早于任何 application/*/common.php 垫片,导致后台 /admin 与前台页面 404。
|
||
#
|
||
# 做法:把 vendor 里仅有的这一处 (boolean) 改为 (bool),语义完全等价。
|
||
#
|
||
# 用法:在服务器上执行 bash scripts/patch_tp_php85.sh [/path/to/project]
|
||
# 脚本幂等,可重复执行;修改前自动备份。
|
||
# =============================================================================
|
||
set -euo pipefail
|
||
|
||
ROOT="${1:-/www/wwwroot/yjyf.gzyakj.com.cn}"
|
||
FILE="$ROOT/thinkphp/library/think/Request.php"
|
||
|
||
if [ ! -f "$FILE" ]; then
|
||
echo "❌ 未找到 $FILE"
|
||
exit 1
|
||
fi
|
||
|
||
if grep -qF '(boolean) $data' "$FILE"; then
|
||
cp -a "$FILE" "$FILE.bak_$(date +%Y%m%d_%H%M%S)"
|
||
sed -i 's/(boolean) \$data/(bool) $data/g' "$FILE"
|
||
echo "✅ 已修复 (boolean) → (bool):$FILE"
|
||
else
|
||
echo "ℹ️ 无需修复(已是 (bool) 或结构已变化)"
|
||
fi
|
||
|
||
# 语法校验
|
||
if command -v php >/dev/null 2>&1; then
|
||
php -l "$FILE"
|
||
fi
|
||
|
||
echo "提示:如启用 opcache,请平滑重载 php-fpm 使补丁生效。"
|