# ED-RUNTIME-001 — PHP 8.5 Compatibility and Exception Diagnostics

**Status:** Implementation prepared  
**Date:** 2026-08-10  
**Scope:** Runtime maintenance following `ED-Review_Einrichtung_Rx-Server.md`

## 1. Ziel

ED-RUNTIME-001 schließt die noch offenen Runtime-Beobachtungen aus der Ersteinrichtung auf Ubuntu 26.04 / Apache / PHP 8.5, soweit sie Reconcilix-Code oder die PHP-Runtime-Konfiguration betreffen.

Der Scope ist bewusst klein:

1. deprecated `curl_close()`-Aufrufe aus aktivem Reconcilix-Code entfernen,
2. Diagnose bei unerwarteten Fehlern beim Persistieren eines `ReconciliationResult` verbessern,
3. PCRE JIT als Runtime-Konfiguration dokumentieren.

Nicht Bestandteil sind LocalStore-Memory-Optimierungen oder weitere Architekturänderungen.

## 2. PHP 8.5 — `curl_close()`

`curl_close()` ist unter PHP 8.5 deprecated und besitzt seit PHP 8.0 keine funktionale Wirkung mehr.

Bei der Code-Inventur wurden aktive Vorkommen nicht nur in `XtreeJsonApiClient`, sondern auch in zwei weiteren HTTP-Clients gefunden. Daher werden die Aufrufe konsistent aus folgenden Klassen entfernt:

- `src/Provider/Xtree/XtreeJsonApiClient.php`
- `src/Provider/Xtree/XtreeRdfPreviewClient.php`
- `src/Provider/Lobid/LobidGndReconcileClient.php`

Es erfolgt keine Änderung an Request-Parametern, Timeouts, Redirect-Verhalten oder Fehlerklassifikation.

## 3. ReconciliationResult Persistence — Exception Logging

Die öffentliche bzw. übergeordnete Fehlermeldung bleibt unverändert:

```text
Unable to persist ReconciliationResult aggregate.
```

Vor dem Wrapping einer unerwarteten `Throwable` wird nun zusätzlich eine serverseitige Diagnose geloggt:

```text
[reconciliation-result-persistence] <ExceptionClass>: <original message>
```

Zeilenumbrüche aus der Exception Message werden vor dem Logging entfernt. Dadurch bleibt das Log einzeilig und besser korrelierbar.

Bewusst nicht geloggt werden Domain- oder Nutzdaten, Candidate-Inhalte oder Stack Traces.

Bereits als `PersistenceException` klassifizierte Fehler werden unverändert weitergereicht und nicht doppelt geloggt.

## 4. PCRE JIT — Serverkonfiguration

Die Meldung

```text
preg_match(): Allocation of JIT memory failed. PCRE JIT will be disabled.
```

ist kein Reconcilix-Codefehler. Für die produktionsnahe Runtime wird PCRE JIT deaktiviert.

Für Apache mit PHP 8.5 kann eine lokale Konfigurationsdatei verwendet werden, z. B.:

```bash
sudo sh -c 'printf "pcre.jit=0\n" > /etc/php/8.5/apache2/conf.d/99-reconcilix.ini'
sudo systemctl reload apache2
```

Danach sollte die wirksame Apache-PHP-Konfiguration geprüft werden. Falls die Installation PHP-FPM statt `mod_php` verwendet, ist die entsprechende FPM-Konfiguration anzupassen; nicht nur die CLI-Konfiguration.

## 5. Regression

Nach der Codeänderung wurden folgende lokale Tests erfolgreich ausgeführt:

```text
WP1-001A Domain Foundation: OK
WP1-001B Application Boundary: OK
WP1-002 Application Flow: OK
WP2-001 RuntimeFactory: OK
WP3-001-005 Discovery Runtime Regression: OK
WP3-003a lobid GND Reconcile Client Contract: OK
```

Zusätzlich wurden alle vier geänderten PHP-Dateien mit `php -l` geprüft.

## 6. Server-Abnahme

Nach dem Einspielen sind auf der Runtime Platform vorgesehen:

1. Prüfen, dass keine `curl_close()`-Deprecation mehr erscheint.
2. Prüfen, dass die PCRE-JIT-Warnung nach `pcre.jit=0` ausbleibt.
3. Je ein kleiner E2E-Reconciliation-Lauf über xTree, Lobid und LocalStore.
4. Exception-Logging nur bei einem real auftretenden Persistence-Fehler verifizieren; kein künstlicher Produktionsfehler ist für die Abnahme erforderlich.

## 7. Abgrenzung

Folgende Punkte werden durch ED-RUNTIME-001 nicht verändert:

- Discovery Access Audit,
- xTree-302-Sonderbehandlung beim Login,
- Candidate Ranking / SQL-Spalte `rank`,
- LocalStore-Memory-Limit,
- Domain- oder Persistenzmodell.
