Bug #121
offen[Bugsink] ErrorException: Warning: file_get_contents(https://rietberg.ratsinfomanagement.net/webservice/portal/getSearch?type=1&maxOccurs=-1&terms=Sozi…
0%
Beschreibung
Bugsink: https://bugsink.cytrus.de/issues/issue/668f8eb8-dc05-4cc3-8f67-45ec49e52192/event/last/
Typ: NEW issue
Projekt: www-rietberg-de
Bugsink Alert
ErrorException: Warning: file_get_contents(https://rietberg.ratsinfomanagement.net/webservice/portal/getSearch?type=1&maxOccurs=-1&terms=Sozi…
Automatisch erstellt durch n8n
KI-Analyse:
Hier ist die präzise Analyse des Fehlers als Senior TYPO3/PHP-Entwickler:
1. Ursache identifizieren¶
Primäre Ursache:
Der Fehler tritt auf, weil die PHP-Funktion file_get_contents() versucht, eine externe HTTP-Anfrage an die URL
https://rietberg.ratsinfomanagement.net/webservice/portal/getSearch?type=1&maxOccurs=-1&terms=Sozialamt
zu senden, aber der Zielserver antwortet mit HTTP 503 Service Unavailable.
Technische Details:
- HTTP 503 bedeutet, dass der Zielserver vorübergehend nicht verfügbar ist (z. B. wegen Wartungsarbeiten, Überlastung oder Downtime).
- Die URL enthält einen XML-Parameter (
&) – dies ist korrekt escaped, aber irrelevant für den Fehler. - Der Fehler stammt aus einer benutzerdefinierten Logik in
/public/index.php(Zeile 21), die vermutlich eine TYPO3-Extension oder ein Custom-Skript ist, das externe Daten abruft.
Sekundäre Ursachen (mögliche Kontextfaktoren):
- Kein Timeout-Handling für die
file_get_contents()-Anfrage (Standard-Timeout in PHP ist oft zu lang oder nicht definiert). - Keine Fehlerbehandlung für HTTP-Statuscodes (z. B. 503, 404, 401).
- Fehlende Caching-Strategie für externe Anfragen (wiederholte Anfragen bei jedem Seitenaufruf).
- SSL/TLS-Probleme (z. B. Zertifikatsvalidierung, unsichere Protokolle) – weniger wahrscheinlich, da der Fehler 503 und nicht 0 (SSL-Fehler) ist.
2. Fix beschreiben (konkret)¶
Kurzfristige Lösung (Quick Fix)¶
Ersetze file_get_contents() durch eine robustere HTTP-Client-Lösung mit Fehlerbehandlung und Timeout:
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
try {
$client = new Client([
'timeout' => 5, // 5 Sekunden Timeout
'verify' => true, // SSL-Zertifikat prüfen
'headers' => ['Accept' => 'application/json'] // Falls API JSON erwartet
]);
$response = $client->get('https://rietberg.ratsinfomanagement.net/webservice/portal/getSearch', [
'query' => [
'type' => 1,
'maxOccurs' => -1,
'terms' => 'Sozialamt'
]
]);
$data = json_decode($response->getBody(), true);
// Weiterverarbeitung der Daten...
} catch (RequestException $e) {
// Loggen des Fehlers (z. B. mit TYPO3 Logger)
\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Log\LogManager::class)
->getLogger(__CLASS__)
->error('Externe API-Anfrage fehlgeschlagen: ' . $e->getMessage());
// Fallback: Leere Daten oder Cache-Wert zurückgeben
$data = [];
}
Langfristige Lösung (Best Practices)¶
-
HTTP-Client mit Retry-Logik:
- Nutze Guzzle mit Retry Middleware, um bei 503-Fehlern automatisch neu zu versuchen.
- Beispiel:
$client = new Client([ 'timeout' => 5, 'retries' => 2, // 2 Wiederholungsversuche ]);
-
Caching implementieren:
- Speichere die API-Antworten im TYPO3-Cache (z. B. mit
CacheManager):$cache = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Cache\CacheManager::class)->getCache('my_api_cache'); $cacheIdentifier = md5('api_search_' . $searchTerm); if ($cache->has($cacheIdentifier)) { $data = $cache->get($cacheIdentifier); } else { // API-Anfrage durchführen und Ergebnis cachen $data = $client->get(...)->getBody(); $cache->set($cacheIdentifier, $data, [], 3600); // 1 Stunde Cache }
- Speichere die API-Antworten im TYPO3-Cache (z. B. mit
-
Fehlerbehandlung für HTTP-Statuscodes:
- Prüfe explizit auf Statuscodes wie 503 und handle sie separat:
if ($response->getStatusCode() === 503) { // Wartungsmodus des Zielservers: Fallback-Daten laden oder Fehlermeldung anzeigen }
- Prüfe explizit auf Statuscodes wie 503 und handle sie separat:
-
Konfiguration in TYPO3:
- Lagere die API-URL in die TYPO3-Konfiguration (
typo3conf/AdditionalConfiguration.phpoder Site-Konfiguration) aus, um sie zentral zu verwalten:$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['my_extension']['api_url'] = 'https://rietberg.ratsinfomanagement.net/webservice/portal/';
- Lagere die API-URL in die TYPO3-Konfiguration (
-
Asynchrone Verarbeitung (optional):
- Für performanzkritische Anwendungen: Nutze TYPO3 Scheduler oder Symfony Messenger, um API-Anfragen im Hintergrund zu verarbeiten.
3. Betroffene TYPO3 Extension nennen¶
Der Fehler stammt nicht aus dem TYPO3-Core, sondern aus einer benutzerdefinierten Extension oder einem Custom-Skript im Projekt:
-
Pfad:
/public/index.php(Zeile 21) – dies ist ungewöhnlich, da TYPO3 normalerweise keine Logik inindex.phphat. -
Verdacht:
- Eine Custom-Extension (z. B.
ext:my_custom_api_integration) oder ein Site-Package, das externe Daten abruft. - Alternativ: Ein Hook/Event-Listener in einer Extension, der die API-Anfrage triggert.
- Eine Custom-Extension (z. B.
Empfehlung:
- Suche nach der Extension, die
file_get_contents()mit der URLrietberg.ratsinfomanagement.netverwendet. - Prüfe die Extension-Konfiguration (
ext_localconf.php,ext_tables.php) oder TypoScript auf API-Aufrufe. - Falls keine Extension gefunden wird: Prüfe Custom-Skripte im
typo3conf/ext/oderpublic/Verzeichnis.
4. Confidence¶
- Ursache (503-Fehler): 100% (klar durch Fehlermeldung).
-
Betroffene Extension: 80% (da der Fehler aus
/public/index.phpkommt, aber die genaue Extension unbekannt ist). - Fix-Empfehlung: 95% (Guzzle + Caching + Fehlerbehandlung sind bewährte Lösungen für externe API-Anfragen in TYPO3).
Zusammenfassung der nächsten Schritte¶
-
Extension identifizieren: Suche nach
file_get_contents()in/public/index.phpoder im Extension-Code. -
Code anpassen: Ersetze
file_get_contents()durch Guzzle mit Fehlerbehandlung (siehe Fix oben). - Caching einbauen: Vermeide wiederholte API-Anfragen.
- Monitoring: Logge API-Fehler (z. B. mit TYPO3 Logger) und richte Alerts ein.
- Dokumentation: Notiere die API-Abhängigkeit und mögliche Downtimes im Projekt-Wiki.
Falls die Extension nicht gefunden wird, könnte auch ein TYPO3-Command-Controller oder ein Scheduler-Task die API-Anfrage auslösen – hier wäre eine Suche nach file_get_contents() im gesamten Projekt notwendig.
Nichts anzuzeigen