- Affected App
- WoltLab Suite Core
Eigentlich sollte man erwarten, dass ein Request nach Ablauf der in der Option timeout angegebenen Zeit abgebrochen wird. Dem ist nur scheinbar nicht so (zumindest unter PHP 7.4, auch CLI), was dazu führt, dass Requests bis zu N Sekunden (default_socket_timeout) laufen, bevor sie abgebrochen werden. Dies wiederum kann zu Server-Timeouts führen, sollte dadurch die im Webserver festgelegte Ausführungszeit überschritten werden.
Das ganze lässt sich auch relativ einfach reproduzieren:
<?php
require __DIR__ . '/global.php';
$start = microtime(true);
try {
$request = new \wcf\util\HTTPRequest('https://www.amd.com/de/products/cpu/amd-ryzen-9-3900x', ['timeout' => 2]));
$request->execute();
$reply = $request->getReply();
} catch (\Exception $e) {
wcfdebug(microtime(true) - $start, $e->getMessage());
}
wcfdebug(microtime(true) - $start, $reply['headers']);
Display More
EDIT:
Was ich vergessen habe zu erwähnen ist, dass ich durchaus geprüft habe, dass stream_socket_client auch den Wert aus der Option erhält. Das Problem liegt also wohl nicht direkt beim WSC. Allerdings kann man das ja auch nicht so lassen, selbst wenn es sich um einen PHP-Fehler handelt.
EDIT:
Problem besteht unter allen PHP-Versionen von 5.6 bis 7.4 (mit CLI getestet).