['onRequest', 48]]; } public function onRequest(RequestEvent $event): void { // Der übliche Fall kostet eine Dateiprüfung. if (!$event->isMainRequest() || !is_file($this->projectDir.'/'.ArchiveUpdate::MARKE)) { return; } $offen = $this->archive->pending(); if (true !== ($offen['fern'] ?? null)) { return; } // Gleichzeitige Anfragen: Eine schließt ab, die anderen sehen die Wartungsseite. $sperre = $this->updater->lock(); if (null === $sperre) { return; } try { if (true !== ($this->archive->pending()['fern'] ?? null)) { return; } @ignore_user_abort(true); @set_time_limit(0); $this->archive->finish($this->installation, $this->pruefung); } catch (\Throwable) { // Was schiefging, steht im Updateprotokoll; die Wartungsseite bleibt dann an. } finally { flock($sperre, LOCK_UN); fclose($sperre); } } }