OPcache 在 php.ini 里没有显式关闭,按 PHP 8.3 默认 opcache.enable=1,也就是说 Web 请求下 OPcache 是开启的——它会对"当前请求已经加载的 PHP 文件"(包括 index.php、Setup.php 等)做字节码缓存并在 Windows 上持有文件映射,这正是 rename() 覆盖失败的另一大常见元凶。
结论
"更新文件失败:index.php" 不是文件夹权限问题,而是 Windows 下升级器用 rename() 原子覆盖 index.php 本身时失败——因为:index.php 是当前这次升级请求的入口文件,Apache/PHP 正在执行它;
同时 OPcache 已开启(默认),对正在加载的文件加了映射锁;
(很可能还有)Windows 实时杀毒在 rename 瞬间扫描锁文件。
Linux 服务器这类问题很少,Laragon/Windows 本地环境很常见。升级器一碰 index.php 就失败并回滚,所以你看到"已恢复升级前文件"——站点现在是正常的。解决(按先易后稳排序)
方案 A:关掉两个"锁"后重试(最快,先试这个)临时关闭 OPcache:在 E:\laragon\bin\php\php-8.3.33-Win32-vs16-x64\php.ini 末尾加一行 opcache.enable=0,重启 Laragon 的 Apache。
把 e:\laragon\www\bbs1v10 加入 Windows 安全中心 → 病毒和威胁防护 → 排除项(或临时关掉实时保护)。
再点一次「在线升级」。若成功,根因就是 OPcache/杀软,问题解决。
方案 B:停服务后手动覆盖(最稳,能绕开"入口文件被占用")在 Laragon 里停止 Apache(此刻没有任何请求占用 index.php,rename/copy 必然成功)。
从官方下载 https://bbs1.org/plugin_market_source?path=bbs1org.zip&download=1,解压,把里面文件覆盖到站点(保留 app/data、app/plugins、app/upload、app/avatars 这些保护目录不动)。
启动 Apache,清缓存即可。
说明:升级器其实已经把文件下载并 sha256 校验到了 app/data/update-xxx 临时目录(只是最后 rename 这步失败回滚了),所以本质上就是"覆盖那几个文件"的事。线上升级没有问题,本地我懒就让ai直接帮我升级😂