Verhaltensänderungen vom 1. und 2. Oktober 2026 (Linie 6.0.15): was Sie beim Upgrade prüfen sollten
Lesen Sie diese Seite, bevor Sie eine Installation auf die Änderungen vom 1. und 2. Oktober 2026 aktualisieren. Sie ist eine Checkliste für Betreiber und Autoren von Erweiterungen: Jeder Punkt sagt, was sich geändert hat, wie Sie es prüfen und was zu tun ist. Die Funktionen sind auf den verlinkten Seiten beschrieben; die Geschichte des Monats steht in der Chronik vom Oktober 2026.
Warnung
.htaccessbremst jede Anfrage. Sind.htaccess-Dateien erlaubt (AllowOverridealles außerNone), geschweige denn genutzt, sucht Apache sie bei jeder Anfrage in jedem Verzeichnis des Pfads und liest und wertet sie aus, und die Ladezeiten der Seiten steigen drastisch (gemessen). Die einzige wirkliche Abhilfe ist, die Funktion für den virtuellen Host abzuschalten:AllowOverride Noneim virtuellen HTTPS-Host, und die Regeln in der Konfiguration des virtuellen Hosts selbst als mod_rewrite-Regeln. Das ist in Geschwindigkeitstests im Produktivbetrieb weit schneller und die Zeit für die Optimierung einer Produktivkonfiguration unbedingt wert. Stellen Sie sofort um: Übernehmen Sie die Regeln des Beispiels für einen virtuellen HTTPS-Host in Ihren virtuellen Host (mit dem statischen Cache auchstaticcache_offload.conf), setzen SieAllowOverride None, führen Sieapachectl configtestaus, laden Sie Apache neu und testen Sie die Website. Dieselben Regeln für andere Server: nginx, LiteSpeed, Caddy, IIS, Velocity (eingebaut); wohin Regeln für virtuelle Hosts in einem Control Panel gehören: Plesk, cPanel, DirectAdmin, ISPConfig. Unter LiteSpeed oder OpenLiteSpeed kann zusätzlich der Seiten-Cache des Servers anonyme Besucher und Crawler ohne PHP bedienen: Seiten-Caching mit LiteSpeed und OpenLiteSpeed.
Reihenfolge beim Bereitstellen
PHP-Klassen, INI-Dateien und Template-Pfade haben sich alle geändert. Führen Sie nach dem Übernehmen der Änderungen Folgendes in dieser Reihenfolge aus:
php bin/php/ezpgenerateautoloads.php -e
php bin/php/ezpgenerateautoloads.php -k
php bin/php/ezcache.php --clear-all --allow-root-user-k durchläuft die ganze Installation. Halten Sie Arbeitskopien der Installation darin, führen Sie sie in
.autoloadignore auf oder übergeben Sie --exclude=<dir>, sonst wird jede Kernel-Klasse der Kopie zugeordnet.
Dann:
- Laden Sie das PHP-FPM neu, das die Website ausliefert.
- Starten Sie Exponential Velocity neu, wenn Sie ihn verwenden. Seine Worker behalten die Klassen, die sie beim Vorwärmen geladen haben.
- Leeren Sie zuletzt den Cache der Inhaltsansichten und den Antwort-Cache von Velocity.
Zugriff und Sicherheit
| Änderung | Wie Sie es prüfen | Was zu tun ist |
|---|---|---|
Stimmabgaben bei Umfragen (expPoll::vote), das Absenden von Formularen (expInfoCollection::submit) und die Wahl des Landes für die Mehrwertsteuer (expVat::setUserCountry) der Remote-Dienste brauchen content/read; sie standen allen offen. | Ein anonymer Besucher ohne content/read kann über die Dienste nicht mehr abstimmen oder absenden. | Geben Sie der Rolle Anonymous content/read (eine öffentliche Website hat es bereits). |
Ein Lesen der Rollen eines Benutzers, der Richtlinien einer Rolle, der Einschränkungen einer Richtlinie oder ihrer Werte, das fehlschlägt (die Datenbank antwortet mit einem Fehler), verweigert, was es nicht lesen konnte: Die Rolle gewährt nichts, die Richtlinie wird weggelassen. Bisher war eine Richtlinie, deren Einschränkungen nicht gelesen werden konnten, unbeschränkt (*). Ein solches Zugriffs-Array gilt nur für diese Anfrage und wird nicht im Benutzer-Cache gehalten; pro Aufbau wird ein Fehler protokolliert (eZRole::accessArrayByUserID). | eZAccessArrayFailClosedTest; mit einer gesunden Datenbank ändert sich nichts. | Nichts. Eine Erweiterung, die eZPolicy::limitationList() liest, sieht eine Richtlinie, deren Einschränkungen nicht gelesen werden konnten, als ausgeschaltet (Disabled) und eine Einschränkung, deren Werte nicht gelesen werden konnten, mit gesetztem ReadFailed. |
Die Einstellungen, das Änderungsprotokoll, der IP-Test und die Cache-Liste der Debug-Leiste brauchen setup/setup oder setup/managecache. | Bisher konnte ein Besucher, der den Debug-Bericht sah, jede Debug-Einstellung lesen. | Geben Sie die Richtlinie an die Rollen, die debuggen. |
| Das Dashboard, die Menüs und die oberen Tabs der Administration zeigen einen Link nur einem Benutzer, der ihn öffnen kann. | Redakteure sehen ohne die Richtlinie die Tabs Design, Newsletter, Export, Benutzer, Dateien hochladen, Tags, Layouts, Einträge des Papierkorbs oder „Passwort ändern“ nicht mehr. | Nichts; prüfen Sie Ihre eigenen Rollen. |
Hochgeladene Bilder werden anhand ihres Inhalts geprüft (hinzugefügt am 12. Oktober 2026). Der Bild-Datentyp (Bearbeitungsformular, content/upload, der Upload-Dialog des Rich-Text-Editors und sein Tab „Von einer URL“, der AJAX-Uploader, WebDAV, Importe) und die Vorschaubilder und Stilbilder des Paket-Assistenten lesen den Typ mit fileinfo von PHP und akzeptieren nur einen Typ aus image.ini [ImageUploadSettings] AllowedMIMETypes[] (JPEG, PNG, GIF, WebP, AVIF, TIFF, BMP). Eine abgelehnte Datei wird nicht gespeichert, und eZContentUpload lehnt sie ab, bevor ein Objekt angelegt wird. Für jede Website eingeschaltet, Upgrades eingeschlossen. | Laden Sie eine in .jpg umbenannte Textdatei oder ein HEIC- oder SVG-Bild hoch: „A valid image file is required.“ oder „Images of the type %1 are not accepted.“ Ohne fileinfo (php -m | grep fileinfo) entscheidet getimagesize(), und eine Warnung pro Prozess sagt das. | Fügen Sie einen Typ, den die Website braucht, in einem Override zu AllowedMIMETypes[] hinzu (ab dem 15. Oktober 2026 steht SVG auf der Liste und wird bereinigt gespeichert, siehe SVG-Bilder); ValidateMIMEType=disabled behält nur die ältere Prüfung. API: expImageUploadValidator::validate( $path ). |
ezoe/upload lehnt eine Datei ab, deren Typ nicht in UploadFileExtensions[] steht, und jeden Namen mit einer ausführbaren Endung an beliebiger Stelle (shell.php.jpg), wenn die Editor-Engine des Benutzers nicht TinyMCE 3 ist (UploadExtensionCheck=engine). | Laden Sie mit der Engine TinyMCE 8 eine .zip oder .pdf hoch. | Fügen Sie den Typ zu ezoe.ini [EditorSettings] UploadFileExtensions[] hinzu. |
Anfrageregeln gibt es und Enabled=true, aber RuleList[] ist leer. | Nichts ändert sich, bis Sie eine Regel aufführen. | Siehe Anfrageregeln; prüfen Sie mit php bin/php/ezrequestrules.php -s <siteaccess> --check. |
content/history öffnet sich für den, der das Objekt bearbeiten darf, nicht nur für den, der es lesen darf; seine Richtlinienfunktionen sind read or edit (sie waren read und edit). Ein Leser braucht wie bisher eine Bearbeitungsrichtlinie für bestimmte Inhalte. Hinzugefügt am 6. Oktober 2026. | Eine Rolle mit einer Bearbeitungsrichtlinie und ohne Leserichtlinie für bestimmte Inhalte listet jetzt die Versionen dieser Inhalte auf (Nummer, Status, Übersetzung, Ersteller, Daten). | Nichts, außer eine solche Rolle darf keine Versionen sehen; dann schränken Sie ihre Bearbeitungsrichtlinie wie ihre Leserichtlinie ein. Siehe die Versionen eines Entwurfs. |
Die Historie vergleicht, kopiert und verlinkt auf die Versionsansicht nur bei Versionen, deren Inhalt der Benutzer sehen darf: veröffentlichte, archivierte und eigene Versionen, eine abgelehnte Version für ihre Bearbeiter und den Entwurf oder die anstehende Version eines anderen nur mit content/versionread. Entfernen nimmt nur Versionen des Objekts in den Status, die die Seite anbietet. Hinzugefügt am 6. Oktober 2026. | Ein Leser mit content/diff und ohne content/versionread vergleicht die Entwürfe anderer Benutzer nicht mehr; eine präparierte Anfrage zum Entfernen einer anstehenden Version wird mit einer Meldung abgelehnt. | Geben Sie content/versionread an Rollen, die die Entwürfe anderer Benutzer vergleichen oder kopieren müssen. Ein Template-Override von content/history.tpl sollte $content_versions verwenden (siehe die Versionen eines Entwurfs); die View lehnt so oder so ab. |
Eine dem Kernel unbekannte Einschränkung einer Inhaltsrichtlinie ohne Handler (site.ini [RoleSettings] LimitationHandlers[]) gibt ihrer Richtlinie auch bei Listen- und Baum-Fetches keinen Zugriff; die Fetches ignorierten sie und listeten Objekte auf, deren Seiten checkAccess() ablehnte. Hinzugefügt am 6. Oktober 2026. | Suchen Sie in Benutzer > Rollen und Richtlinien (oder in der Tabelle ezpolicy_limitation) nach anderen Einschränkungen als Class, Section, Owner, Group, Node, Subtree, Language, Status und StateGroup_. | Entfernen Sie sie, oder installieren Sie die Erweiterung, die sie behandelt. Siehe Einschränkungen von Inhaltsrichtlinien aus Erweiterungen. |
versionread und versionremove halten bei der ersten Einschränkung einer Richtlinie an, die verweigert (eine nicht passende Language, eine Einschränkung, die der Kernel nicht kennt); die nächste Einschränkung könnte die Richtlinie sonst wieder erlauben. Benachrichtigungen für Teilbäume prüfen die Einschränkung Group von content/read. Hinzugefügt am 6. Oktober 2026. | Eine Rolle mit einer solchen Richtlinie liest weniger Versionen; ein Abonnent außerhalb der Gruppen des Besitzers erhält über eine Richtlinie „Self group“ keine E-Mail. | Nichts, außer eine Rolle hat sich darauf verlassen. |
Der Rolleneditor und der Richtlinieneditor speichern für eine Einschränkung nur die Werte, die sie angeboten haben; ein in der Anfrage erfundener Wert wird weggelassen und protokolliert. Ein Handler für Inhaltseinschränkungen, der eine Ausnahme wirft, verweigert, statt die Anfrage zu beenden, und eine Bedingung als Zeichenkette aus permissionSQL(), die nicht in sich geschlossen ist (unausgeglichene Anführungszeichen oder Klammern, ein ; oder ein Kommentar außerhalb von Zeichenketten in Anführungszeichen), gibt ihrer Richtlinie in Fetches keinen Zugriff. eZUser::accessUser() liefert für ein deaktiviertes Konto keinen Benutzer. Hinzugefügt am 6. Oktober 2026. | Ein Handler, dessen SQL seine eigenen Klammern geschlossen hat oder auf dessen Ausnahmen man sich verlassen hat, um eine Anfrage zu stoppen, verweigert jetzt. Prüfungen für einen anderen Benutzer lehnen ein deaktiviertes Konto ab. | Geben Sie eine in sich geschlossene Bedingung oder die Spaltenform zurück (array( 'column' => ..., 'values' => ... )); prüfen Sie einen Benutzer mit ./console exp:access:check. Siehe Einschränkungen von Inhaltsrichtlinien aus Erweiterungen. |
role/view führt die Benutzer und Gruppen einer Rolle seitenweise auf (site.ini [RoleSettings] AssignmentsPerPage, Standard 50). $user_array enthält eine Seite; alle Zuweisungen sind $assignment_total, diejenigen, die der Namensfilter behält, $assignment_count. Einträge von $user_array tragen user_name und ein user_object mit null für ein nicht mehr vorhandenes Objekt. Hinzugefügt am 6. Oktober 2026. | Ein Design, das role/view.tpl überschreibt, zeigt nur die ersten 50 Zuweisungen und zählt $user_array. | Fügen Sie eine Seitennavigation über (assignment_offset) hinzu, wie design/admin/templates/role/view.tpl es tut (Seitenweise Zuweisungen von Rollen), oder setzen Sie AssignmentsPerPage=0, um alle aufzuführen. |
Neue Richtlinienfunktion content/publish_without_notification und notification.ini [NotificationSettings] PublishWithoutNotification (disabled). Die Veröffentlichungsoperation nimmt notify an (Standard true); der Filter content/notification/create kann false erhalten. Bei asynchronem Veröffentlichen wird eine Veröffentlichung ohne Benachrichtigung sofort veröffentlicht, nicht in die Warteschlange gestellt. | Nichts ändert sich, bis die Einstellung eingeschaltet wird. Ein Listener von content/notification/create, der true zurückgibt, egal was er erhält, setzt sich über den Redakteur hinweg. Eine Rolle mit content/* schließt die neue Funktion ein. | Schalten Sie die Einstellung dort ein, wo sie gewünscht ist, und vergeben Sie die Funktion; geben Sie $create in Listenern weiter. Siehe Ohne Benachrichtigung veröffentlichen. |
Ein Benutzer, der Rollen bearbeiten darf, kann nicht mehr vergeben, als er selbst hat (site.ini [RoleSettings] PreventPrivilegeEscalation=enabled, neu). Der Rolleneditor, der Richtlinien-Assistent, der Richtlinieneditor, role/copy und role/assign lehnen eine Richtlinie, eine Kopie oder eine Zuweisung ab, die der eigene Zugriff des Bearbeiters nicht abdeckt, mit einer Meldung, die die Richtlinien nennt. Benutzer mit jeder Funktion jedes Moduls sind nicht betroffen. Hinzugefügt am 6. Oktober. | Melden Sie sich als Benutzer an, dessen Rollen das Modul role enthalten, aber keinen vollen Zugriff, und fügen Sie eine Richtlinie hinzu, die er nicht besitzt: Der Editor meldet „The policy was not added“. | Geben Sie den Bearbeitern von Rollen den Zugriff, den sie vergeben sollen, oder lassen Sie es Administratoren mit vollem Zugriff tun. PreventPrivilegeEscalation=disabled stellt das alte Verhalten wieder her. Siehe Rollen und Richtlinien. |
Das Aktivieren eines Kontos (user/activate und Aktivieren in user/unactivated) startet die Registrierung nicht mehr neu, wenn keine ansteht: Ein solches Konto wurde wieder deaktiviert und erhielt einen neuen Aktivierungslink per E-Mail. Eine anstehende Registrierung wird wie bisher fortgesetzt. Aktivieren in user/unactivated sendet wieder die E-Mail „Registrierung genehmigt“, wie es der eigene Link des Benutzers tut (site.ini [UserSettings] ActivationByAdministratorSendsApprovalMail=enabled, neu). Der Veröffentlichungsschritt einer Aktivierung vergleicht die Version des Objekts als Zahl: Unter SQLite wurde er abgebrochen, sodass keine Aktivierung das Benutzerobjekt veröffentlichte oder die Genehmigungs-E-Mail sendete. Hinzugefügt am 6. Oktober. | Aktivieren Sie eine Registrierung von Hand: Der Benutzer erhält die Genehmigungs-E-Mail (außer bei EmailRegistrationInfo=disabled). | Setzen Sie ActivationByAdministratorSendsApprovalMail=disabled, um ohne E-Mail von Hand zu aktivieren. |
Ein Benutzer ohne jede Richtlinie content/read (Zugriffswort no), was auch ein Benutzer erhält, wenn jedes Lesen des Zugriffs-Arrays fehlschlägt, bekommt von Listen-, Baum-, Zähl- und Kalender-Fetches, der Suche, dem Papierkorb, den Schlagwortlisten und den Unterelementzählungen der Administration keinen Knoten aufgeführt: eZContentObjectTreeNode::createPermissionCheckingSQL( false ) liefert 0 = 1. Bisher lieferte es keine Bedingung, und einem solchen Benutzer wurde jeder Knoten aufgeführt (dessen Seiten checkAccess() dann ablehnte). Voller Zugriff (yes, eine leere Liste) liefert weiterhin keine Bedingung. Hinzugefügt am 6. Oktober 2026. | Auf dem Demonstrationsserver wurden drei Benutzern in einer Gruppe ohne Rolle alle 332 Knoten aufgeführt, jetzt keiner; jeder andere Benutzer, anonym eingeschlossen, erhält dieselben Listen wie bisher. | Geben Sie content/read an die Rollen der Benutzer, die Listen sehen müssen. Eine Erweiterung, die createPermissionCheckingSQL( false ) im Sinne von „keine Einschränkung“ aufruft, muss ein leeres Array übergeben. |
| Das Formular für den Ablageort des AJAX-Uploaders trägt statt des Pfades der gespeicherten Datei ein Einmal-Token dafür (hinzugefügt am 14. Oktober 2026). Das Token ist an den Benutzer und das Upload-Ziel gebunden und lebt eine Stunde; ein abgelehnter Ablageort behält es, sodass ein anderer gewählt werden kann. | Laden Sie über den Dialog „Hochladen“ eines Beziehungsattributs hoch und wählen Sie einen Ablageort. | Ein Override von ajaxuploader/location.tpl muss UploadToken ({$upload_token|wash()}) statt UploadFile und UploadOriginalFilename senden. |
Setup > Extensions lädt ein Paket über eine Schaltfläche seines Formulars herunter; die Adresse /setup/extensions/<name>/<format> zeigt die Liste und lädt nicht mehr herunter (hinzugefügt am 14. Oktober 2026). | Drücken Sie eine Download-Schaltfläche unter Details. | Lesezeichen und Skripte, die die Adresse abriefen: Verwenden Sie die Schaltfläche, oder php ezpm.php auf der Kommandozeile. |
Kein Paket nimmt eine Erweiterung auf, die einen geheimen Wert oder Schlüsselmaterial enthält: Setup > Extensions, der Paket-Assistent und ezpm.php lehnen sie ab und nennen die Dateien und Einstellungen (hinzugefügt am 14. Oktober 2026). Vorher erstellte Pakete behalten, was sie enthalten. | Laden Sie eine Erweiterung herunter, deren Einstellungen ein Passwort enthalten. | Entfernen Sie das Geheimnis aus der Erweiterung (es gehört nach settings/override), oder führen Sie es bei einem bekannten Beispiel in der package_check.ini der Erweiterung auf (die Prüfung auf Geheimnisse). |
Audit-Protokoll
Das Audit-Protokoll ist in jeder Installation standardmäßig eingeschaltet (in 4.x war es aus).
- Die Einträge gehen nach
var/<site>/log/audit/. - Legen Sie in einer bestehenden Installation einmal die Index-Tabellen an:
php update/common/scripts/6.0/createaudittables.php - Führen Sie die Cronjob-Gruppe
frequentaus. - Alte Aufrufe von
eZAudit::writeAudit()funktionieren weiter. - Nur die Rolle Administrator besitzt
audit/readundaudit/manage.
Details: Upgrade des Audit-Protokolls.
Frontend und Designs
| Änderung | Was zu tun ist |
|---|---|
YUI ist aus den Admin-Designs und aus ezjscore 1.5.0 entfernt (ezjsc::yui2, ezjsc::yui3 und ezjsc::yui3io laden nichts). | Lesen Sie YUI-Entfernung; stellen Sie den Code auf jQuery 4 oder Exponential UI um. |
ezjsc::jquery ist jQuery 4.0.0 mit Migrate 4.0.2; ezjsc::jqueryUI ist jQuery UI 1.14.2. | Alte Templates, die Funktionen von jQuery 1.x verwenden, funktionieren über Migrate. Um zu sehen, was sie verwenden, setzen Sie LocalScripts[jqueryMigrate]=jquery-migrate-4.0.2.js (den meldenden Build) in ezjscore.ini. |
Neues Admin-Design admin4; neues Design editor und neuer Siteaccess für neue Installationen. | Schalten Sie es mit SiteDesign=admin4 ein (admin4). Eine bestehende Installation erhält keinen Siteaccess editor. |
Ein angemeldeter Benutzer mit der Richtlinie uiswitch/design kann für seine eigene Sitzung ein anderes Administrationsdesign wählen (admin4l, admin4, AdminUI, das klassische Design oder ein Design einer Erweiterung wie admin_classic), über das Werkzeug admin_ui_switch der rechten Werkzeugleiste (hinzugefügt am 15. Oktober 2026). Der Dateiname des Design-Base-Caches des aktuellen Siteaccess enthält den Varianten-Schlüssel der UI-Umschaltung, solange eine Wahl angewendet wird; sonst unverändert. | Vergeben Sie uiswitch/design an die Rollen, die umschalten dürfen. Stellen Sie sicher, dass jedes angebotene Design admin_ui_switch rendert; ein Siteaccess, dessen eigenes Design das klassische ist, braucht Tool[]=admin_ui_switch in [Toolbar_admin_right]. Entfernen Sie die Kernel-Overrides von sevenx_themes_admin_classic vor 0.2.5. Siehe die Umschaltung des Designs und ihre Anleitung. |
| Die Kernel-Designs zeigen das Exponential-Logo; die Debug-Ausgabe trägt die Überschrift „Exp Debug“. | Ändern Sie eigenes CSS oder Tests, die den alten Überschriftentext abgleichen. |
Das Entfernen von RSS-Exporten oder -Importen (rss/list) und Workflow-Gruppen (workflow/grouplist) zeigt zuerst eine Bestätigung; erst ein zweiter POST mit ConfirmRemoveButton und denselben IDs entfernt. Das Entfernen einer Workflow-Gruppe behält einen Workflow, der auch in einer anderen Gruppe ist. | Ein Skript oder ein überschriebenes rss/list.tpl oder workflow/grouplist.tpl, das RemoveExportButton, RemoveImportButton oder DeleteGroupButton sendet, landet jetzt auf der Bestätigung (rss/confirmremove.tpl, workflow/confirmremovegroup.tpl); fügen Sie ConfirmRemoveButton=1 hinzu, um sofort zu entfernen. Siehe RSS-Feeds und Workflows. |
Eine Änderung an einer .css-Datei der Administration braucht das Leeren des Caches template-block: Der gepackte Link _<mtime>_all.css ist im Seitenkopf gecacht. exp:velocity deploy --packer erledigt das. | php bin/php/ezcache.php --clear-tag=template --allow-root-user, dazu die Caches content und template-block. |
Struktur des Codes
Jeder Befehl des Kernels, jeder Cronjob-Teil und jede Modul-View ist jetzt eine Klasse (Spezifikation). Die Einstiegspunkte behalten ihre Pfade.
- Code, der die alten Dateien wegen ihrer Logik gelesen hat, muss in
kernel/private/classes/suchen. - Eine Erweiterung kann eine Klasse durch eine eigene Unterklasse ersetzen:
site.ini [RunnableSettings] Implementation[<class>]=<subclass>. checkAccess()voneZContentObject,eZContentObjectTreeNodeundeZContentObjectVersionnimmt den zu prüfenden Benutzer als sechstes Argument an,$userID = false(hinzugefügt am 6. Oktober 2026). Eine Klasse, die eine davon überschreibt, muss es annehmen, sonst bricht PHP 8 beim Laden der Klasse mit einem fatalen Fehler ab.
Daten und Jobs
| Änderung | Was zu prüfen oder zu tun ist |
|---|---|
Die Zeilen des Papierkorbs halten in den neuen Spalten ezcontentobject_trash.trashed_by und trashed_via fest, wer ein Objekt in den Papierkorb verschoben hat und von wo; <VarDir>/trash/trashed.json wird nicht mehr geschrieben, sobald sie existieren. Hinzugefügt am 9. Oktober 2026. | Führen Sie das Datenbank-Update Ihrer Engine aus (update/database/<engine>/6.0/dbupdate-6.0.0-6.0.15.sql); Setup > System Upgrade führt die fehlenden Spalten auf. Bis es gelaufen ist, arbeitet der Kernel mit der alten Tabelle und schreibt weiter die Datei, sodass Code und Update in beliebiger Reihenfolge kommen können. Kopieren Sie dann, was die Datei festgehalten hat, mit php update/common/scripts/6.0/movetrashrecords.php --remove-file (auf jedem Webserver eines Clusters). Siehe die Ansicht des Papierkorbs. |
| „Papierkorb leeren“ löscht in Gruppen von 100, jede in ihrer eigenen Transaktion, mit einer Pause von einer Sekunde. | Große Papierkörbe brauchen im Browser länger, laufen aber nicht mehr in einen Timeout. Verwenden Sie für die größten bin/php/trashpurge.php. |
| „Abgelaufene Sitzungen entfernen“ entfernt auch die Warenkörbe dieser Sitzungen. | Nichts. |
Der Cronjob-Teil clusterpurge löscht Dateien, die vor 30 Tagen abgelaufen sind (er verwendete 30 Sekunden). | In einer Cluster-Installation leben abgelaufene Cache-Dateien jetzt ihre Schonfrist. |
| Ein kopiertes Objekt mit einem Bild besitzt eigene Bilddateien; das Entfernen eines Entwurfs entfernt alle seine Bilddateien. | Nichts. |
| Das Entfernen eines Medienattributs löscht die Datei nur, wenn keine andere Medienzeile sie nennt. | Nichts. |
| Das Entfernen eines Teilbaums, der jeden Ablageort eines Objekts enthält, entfernt das Objekt. | Nichts. |
| Das Entfernen, Kopieren oder Verschieben von mehr als 50 Knoten bietet zuerst einen Inhaltsjob an. | Stimmen Sie content.ini [ContentJobSettings] SynchronousLimit ab (Standard 50). |
| Die Aktualisierung des statischen Caches beim Veröffentlichen ruft jede Seite einmal ab, parallel. | Siehe den Generator für den statischen Cache; stimmen Sie staticcache.ini [CacheSettings] FetchConcurrency ab (Standard 8, nicht in der ausgelieferten Datei aufgeführt). |
runcronjobs.php lässt einen Teil aus, der unter Setup > Cronjobs pausiert ist, auch einen, den eine Erweiterung pausiert hinterlassen hat (<cache>/cronjob_control/cronpart_deactivated_<part>.txt mit dem Inhalt 1). Hinzugefügt am 15. Oktober 2026. | Sehen Sie sich nach dem Update Setup > Cronjobs an und setzen Sie fort, was laufen soll; oder setzen Sie cronjob.ini [PauseSettings] Pause=disabled. Siehe Cronjob-Teile pausieren. |
Ein während seines Laufs pausierter Teil beendet das laufende Skript, und runcronjobs.php lässt die Skripte danach aus; jeder Lauf, den eine Pause auslässt, wird in <log directory>/cronjob_skipped.log geschrieben; Pausen und Fortsetzungen werden auditiert (system.cronjob.pause, system.cronjob.resume). Hinzugefügt am 15. Oktober 2026. | Lesen Sie cronjob_skipped.log nach einem Release, um zu sehen, was eine Pause zurückgehalten hat. Auf mehreren Servern setzen Sie [PauseSettings] Directory auf ein gemeinsames Verzeichnis, siehe Cronjob-Teile pausieren. |
Setup > Cronjobs führt die Teile standardmäßig in einer kompakten Tabelle auf; Detailliert zeigt die Karten. Der Schalter schreibt die Benutzereinstellung admin_cronjobs_view per POST. Hinzugefügt am 15. Oktober 2026. | Wählen Sie einmal Detailliert, um die Karten zu behalten. |
| SQLite-Transaktionen stellen sich für die Schreibsperre an. | Siehe SQLite-Transaktionen. |
Fehlende Bibliotheken
Ein fehlendes Verzeichnis vendor/ zeigt jetzt eine Seite mit einem Reparaturverfahren statt der rohen
Fehlerausgabe von PHP. Siehe Reparatur aus dem Browser und
das Upgrade der Reparaturseite.
Seit dem 9. Oktober 2026 lehnt eZSOAPClient einen Aufruf über HTTPS ab, wenn die PHP-Erweiterung curl nicht geladen
ist: send() gibt 0 zurück, ErrorString sagt, dass HTTPS die PHP-Erweiterung curl braucht, und das
Fehlerprotokoll enthält „No SOAP call to <server>: HTTPS needs the PHP extension curl, which is not loaded“. Bisher ging
ein solcher Aufruf als Klartext an den TLS-Port, den kein HTTPS-Server mit einer SOAP-Antwort beantwortet. Prüfen Sie mit
php -m | grep curl (und im PHP des Webservers), dass curl überall geladen ist, wo SOAP-Aufrufe über HTTPS gemacht
werden. Aufrufe über HTTP sind unverändert. Siehe SOAP-Aufrufe über HTTPS.
Composer-Abhängigkeiten, Bildeditor und Tests (24. und 25. Oktober 2026)
| Änderung | Wie prüfen | Was tun |
|---|---|---|
composer.json verlangt zetacomponents/authentication-database-tiein, zetacomponents/mvc-authentication-tiein (beide require) und zetacomponents/php-generator (require-dev) nicht mehr. Kein Code des Kernels oder der Pakete, die er verlangt, verwendet sie. zetacomponents/configuration bleibt verlangt, solange 7x SQLI Import 2.0.x eine seiner Ausnahmen wirft; se7enxweb/ezie und zetacomponents/image-conversion bleiben ebenfalls verlangt. | grep -rE 'ezc(AuthenticationDatabase|MvcAuthentication|PhpGenerator)' extension/ <Ihr Code> | Eigener Code, der eine der drei verwendet, verlangt sie in der composer.json Ihres Projekts (composer require zetacomponents/php-generator); sonst entfernt das nächste composer update sie. |
Der Setup-Assistent und der Kickstarter aktivieren für eine neue Installation expimageeditor, wo sie ezie aktivierten. Bestehende Installationen behalten ihre ActiveExtensions; ezie bleibt installiert. | ActiveExtensions[] in settings/override/site.ini.append.php einer neuen Installation. | Nichts. Eine bestehende Site auf expimageeditor umstellen: ActiveExtensions[]=expimageeditor statt ezie, dann php bin/php/addeditorpolicies.php --apply --only=expimageeditor/edit (expimageeditor). |
Das Protokoll der Inhaltsjobs schreibt seine Zahlen mit Punkt, welche Locale config.php auch setzt („in 0.01 s, peak 30.0 MB“; unter einer deutschen Locale war es „0,01“). | Das Protokoll eines Jobs unter Setup > Inhaltsjobs. | Ein Skript, das die Form mit Komma las, liest den Punkt. |
Mit dem MySQLi-Cluster-Backend (eZDFSFileHandlerMySQLiBackend) unter PHP 8.1 und neuer wird auf eine Cache-Datei, die ein anderer Prozess erzeugt, wieder gewartet, statt sie ein zweites Mal zu erzeugen: startCacheGeneration() gibt die verbleibende Erzeugungszeit zurück, und eine abgelaufene Erzeugung wird übernommen. Ein fehlgeschlagenes SELECT ... FOR UPDATE am Ende einer Erzeugung rollt zurück und meldet den Fehler statt eines TypeError. | Sites im Cluster unter Last: weniger doppelte Erzeugungen desselben View-Caches. | Nichts. |
Die Tests der Gruppe database laufen auf Wegwerf-Datenbanken exp_test_<pid>_<hex> unter MySQL/MariaDB, und die Live-Tests verwenden EXP_TEST_SITEACCESS oder DefaultAccess (sie verwendeten admin). tests/runtests.php --db-per-test --dsn=… leert nur eine Datenbank mit test, tests oder testdb als Wort des Namens. | vendor/bin/phpunit --group database ohne ein Konto mit CREATE und DROP auf exp\_test\_% überspringt mit dem Grund. | Für die Testläufe: EXP_TEST_DB_USER und EXP_TEST_DB_PASSWORD, siehe Testen. |
Upgrade-Befehle (28. Oktober 2026)
| Änderung | Wie prüfen | Was tun |
|---|---|---|
bin/php/addeditorpolicies.php und bin/php/addmembermanagement.php zeigen nur, was sie ändern würden, außer --apply ist angegeben; vorher schrieben sie standardmäßig und nahmen --dry-run. --dry-run wird weiter angenommen und bedeutet dasselbe wie keine Option; --apply zusammen mit --dry-run ist ein Aufruffehler (Exit-Code 2). Der Setup-Schritt einer neuen Installation ist nicht betroffen: Er ruft die Klassen auf, nicht die Befehle. | Einen der Befehle ohne Optionen ausführen: Er listet, was er ändern würde, und endet mit PASS: ... (dry run, nothing changed; --apply writes). | In einem Skript oder einer Anleitung, die einen der Befehle ohne --dry-run ausführte, um die Änderung vorzunehmen, --apply ergänzen. Ein Aufruf mit --dry-run allein bleibt ein Probelauf. Siehe Richtlinien der Rolle Editor. |
Befehle ändern nur mit --apply etwas (28. Oktober 2026)
Die Befehle unten ändern eine bestehende Installation: ihre Rollen, Workflows, Inhalte, Logs, Mails, die Crontab, die
Konfiguration von Velocity oder eine ganze Datenbank. Bis zum 28. Oktober 2026 nahm ein Lauf ohne Optionen die Änderung
vor, sodass ein Lauf, der nur den Plan zeigen sollte, die Installation bereits änderte. Jeder davon zeigt jetzt nur, was
er ändern würde, und endet mit PASS: ... (dry run, nothing changed; --apply writes); --apply nimmt die Änderung vor
und prüft sie. Ein --dry-run, das der Befehl hatte, wird weiter angenommen und bedeutet dasselbe wie keine Option;
--apply zusammen mit --dry-run ist ein Aufruffehler und beendet den Befehl mit Exit-Code 2, bevor er die Datenbank
liest. Der Setup-Assistent, der Kickstarter und die Cronjob-Teile rufen die Klassen auf, nicht die Befehle, und sind
nicht betroffen.
| Befehle | Was jetzt nur --apply tut |
|---|---|
addeditorpolicies, addmembermanagement, addanonymouspublicpolicies, addexphelpreadpolicy (exp:help-grant), addoauthauthorizepolicy, adduserapproval (beide Modi, Gruppe und Abschnitt), cleanuppolicies, adddefaultstates | Richtlinien, Rollen, Workflow-Ereignisse und Abschnitte hinzufügen, gewähren, entfernen oder zuweisen; Objekten ihre Standardzustände geben. adddefaultstates hatte vorher keinen Probelauf. |
install (exp:install), kickstarter run | Installieren. Der Probelauf prüft kickstart.ini, die Datenbank und die entfernten Pakete und zeigt den Plan, bei DatabaseAction=remove mit „would DROP every table“. --force allein ist jetzt ein Aufruffehler (Exit-Code 2); zusammen mit --apply wird es angenommen. |
audit (rotate, archive, restore, purge, reindex, pseudonymise, import, checkpoint, key rotate, sinks flush, cron), explogs (--rotate, --rotate-all, --prune, --compress, --truncate), contentcheck (--fix, --quarantine, --fix-permissions), exphelpcontent (install, tables, classes, tree, roles, check --fix, seed-glossary, seed-topics, build-manuals, ebooks, feedback --prune, uninstall) | Die schreibenden Aktionen; die lesenden (status, tail, search, report, verify, export ...) bleiben, wie sie waren. |
exploremipsumfill, collaborationsampledata (auch --remove), cleanuprss, clusterpurge, ezsubtreecopy, ezsubtreeremove, trashpurge, cleanupversions | Inhalte und Dateien füllen, anlegen, entfernen, löschen oder kopieren. |
mailbounces, mailconsent cleanup, notificationevents cleanup, notificationsubscriptions remove-missing, notificationrun (exp:notification:run) | Adressen sperren, Zeilen entfernen, Benachrichtigungsmails senden. Ein Probelauf sendet nie eine Mail. |
installcrontab --add, --remove | Den Crontab-Block schreiben; der Probelauf zeigt den Block und die Zeilen, die sich ändern würden. --show bleibt, wie es war. |
preload (exp:preload); velocity config set und unset, cache clear, layout migrate, site, conf und mod enable und disable, ssl renew, watchdog install und remove, install der Engine FrankenPHP; webserver configure; frankenphp install | Die Site abrufen; die Einstellungen von Velocity und die Links in /etc/vc schreiben, seinen Antwort-Cache leeren, die Units des Watchdogs oder die Engine installieren. |
Bewusst nicht geändert:
| Befehl | Warum |
|---|---|
ezpgenerateautoloads, cache (exp:cache) und bin/php/ezcache.php | Sie arbeiten wie Build-Werkzeuge: Sie erzeugen Dateien neu, die sich immer neu erzeugen lassen, und Composer, das Deployment (exp:velocity deploy), die CI und unzählige Anleitungen führen sie aus. Sie wirken weiter sofort. |
velocity und webserver start, stop, graceful, restart, kill, status, watchdog run, ctl, ext; exp:velocity deploy | Prozesssteuerung, die installierte systemd-Units und der Watchdog aufrufen; deploy behält sein eigenes --dry-run. |
dfscleanup | Es schreibt bereits nur mit -D. |
resetuserpassword, userpasswordchangerequired | Das Schreiben ist ihr Zweck. |
updatesearchindex, updateniceurls, makestaticcache, ezgeneratetranslationcache, warm, preloadjob | Sie bauen Caches und Indizes neu auf, die sich neu aufbauen lassen; die Cache-Seite, der Setup-Assistent und Cron rufen sie auf. |
Die einmaligen Upgrade-Konverter (convertezenumtoezselection, convertprice2multiprice, ezconvert2isbn13, updateisbn13, ezconvertdbcharset, ezconvertmysqltabletype, ezflowupgrade, ezwebininstall, ezwebinupgrade) | Jeder ist ein Schritt eines dokumentierten Upgrades; sie ändern sich mit diesen Schritten. |
Importe und Schema-Werkzeuge (ezimportdbafile, ezsqlinsertschema, ezcsvimport, publish_content, ezcreatedeactivatedusergroup, flatten, ezsessiongc) | Das Schreiben ist ihre Aufgabe; Installer, Admin-Seiten und Cron rufen sie auf. |
ini set, expcontentjob, maintenance, services, i18n, solr, phar | Befehle mit Unterbefehlen, die Admin-Seiten, das Deployment und Cron aufrufen; in dieser Runde nicht geändert. |
| Wie prüfen | Was tun |
|---|---|
Einen der Befehle ohne Optionen ausführen: Er listet, was er ändern würde, und endet mit PASS: ... (dry run, nothing changed; --apply writes). | In jedem Skript, jeder Crontab-Zeile und jeder Anleitung, die einen dieser Befehle ausführt, um die Änderung vorzunehmen, --apply ergänzen; ein Aufruf mit --dry-run allein bleibt ein Probelauf. Vor allem: ein Skript, das eine Demo oder einen Test mit exp:install, collaborationsampledata oder preload neu aufbaut (die Beispiele im Demomodus übergeben --apply und brechen ab, wenn nichts installiert wurde), und eine Crontab-Zeile eines Betreibers, die einen Befehl direkt aufruft (der Crontab-Block einer Installation führt nur runcronjobs.php aus und ist nicht betroffen). Ein Skript gegen eine ältere Version ohne --apply ausführen: Vor dem 28. Oktober 2026 lehnen die Befehle die Option als unbekannt ab. |
Das WebDAV-Einstiegsskript heißt index_webdav.php (29. Oktober 2026)
Ändern Sie Ihre vhost- und Rewrite-Regeln. Die vollständigen Regeln vorher/nachher für Apache, Plesk, nginx und IIS und das Testverfahren: Das WebDAV-Einstiegsskript heißt jetzt index_webdav.php.
| Änderung | Wie prüfen | Was tun |
|---|---|---|
Der WebDAV-Server ist index_webdav.php, benannt wie index_rest.php, index_treemenu.php und index_cluster.php. webdav.php bindet ihn nur noch ein, schreibt einmal am Tag eine Warnung in warning.log und wird in einer späteren Hauptversion entfernt. .htaccess_root und .htaccess_root_static tragen eine auskommentierte Regel #RewriteRule ^index_webdav\.php - [L]. | grep -rn 'webdav\.php' über die virtuellen Hosts (HTTP und HTTPS), .htaccess, die zusätzlichen Anweisungen von Plesk, die nginx- und IIS-Konfigurationen; grep 'old name of the WebDAV entry script' var/log/warning.log. | index_webdav.php in jeder Regel nennen (RewriteRule, nginx-location und fastcgi_param SCRIPT_FILENAME, IIS-Regeln, Freigabelisten der Skripte im Wurzelverzeichnis), dann testen: curl -i -X OPTIONS (DAV: 1) und curl -i -X PROPFIND -H 'Depth: 1' (207 Multi-Status) gegen /index_webdav.php/. Unter /webdav.php/... eingebundene Clients funktionieren über den Shim weiter; binden Sie sie unter /index_webdav.php/... neu ein. WebDAV fragt weiterhin standardmäßig nie nach einem zweiten Anmeldeschritt. |