• Maser

    升级失败
    勾选数据库同步时,将根据当前程序幂等同步数据库结构和索引。

    更新文件失败:index.php;已恢复升级前文件。

    应该

    主楼
  • bbs1

    https://bbs1.org/topic/1901

    #1
  • Maser

    原来不是我一个人,本地用的Laragon,看了下是只读模式,改了又没有改,我让ai给我改权限试试

    #2
  • Maser

    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 这步失败回滚了),所以本质上就是"覆盖那几个文件"的事。

    #3
  • Maser

    线上升级没有问题,本地我懒就让ai直接帮我升级😂

    #4

发表回复

登录后回复