PHP Timeout für einzelnen for-Schleife Durchlauf oder get_headers Abfrage?
Hallo,
wie kann ich in einer for-Schleife einen Durchlauf abbrechen, wenn dieser länger als 5 Sekunden dauert? Kurz erklärt was ich mache / vorhabe:
Ich frage den Header von verschiedenen Servern ab und lasse das entsprechende Ergebnis in einem Array speicher, womit ich später weiterarbeiten kann. Soweit klappt es wie es soll, nur wie bekomme ich es hin, dass ein einzelner Schleifendurchlauf (nicht die gesamte Schleife) nach 5 Sek. abgebrochen wird, wenn der Server nicht erreichbar ist oder bis dahin kein Ergebnis vorliegt? Aktuell dauert es ca. 15 Sek. und wenn 5 von 20 Servern nicht erreichbar sind, dauert es über 1 Minute was ich gerne reduzieren möchte. Wie könnte ich also entweder den einzelnen Schleifendurchlauf oder die get_headers Abfrage nach 5 Sek. abbrechen und ein entsprechendes Ergebnis in eine Variable setzen?
Danke im Voraus.
Freundliche Grüße
4 Antworten
a) Führe die Requests mit cURL aus. Dann besteht auch die Möglichkeit, einen Timeout anzugeben. Das sollte die einfachste und beste Option darstellen.
b) Du könntest versuchen, den Timeout für eine gewisse Zeit so herunterzusetzen:
$initialStreamContext = stream_context_get_options(stream_context_get_default());
stream_context_set_default([ "http" => [ "timeout" => 5 ] ]);
// do some requests ...
stream_context_set_default($initialStreamContext);
c) Führe die Aktion auf einem eigenen Fork aus. Diese beiden Funktionen dürften hilfreich sein:
Allerdings solltest du dir zuvor den Einleitungstext zu dieser Extension durchlesen.
cURL nutzen in Verbindung mit CURLOPT_TIMEOUT. In den Kommentaren der get_headers Beschreibung findest du auch entsprechende Snippets, die dafür taugen sollten.
Vielleicht setzt du lieber bei der Abfrage der Header ein Timeout.
Oder du machst das ganze Asynchron, dann kannst du alle Abfragen gleichzeitig laufen lassen.
Wie holst du dir denn diese Header? Hast du mal den Codeausschnitt?
Gerne, kein Problem
$url = array(
"http://server1.de",
"http://server2.de",
"http://server3.de",
//und so weiter
);
for($x=0; $x <count ($url); $x++) {
$get_url_header = get_headers(url[$x]);
$url_header = $get_url_header[0];
$ausgabe = ltrim($url_header, "HTTP/1.0");
if (strpos($ausgabe , '200 OK') !== false) {
$server[$x] = 'erreichbar';
}
else {
$server[$x] = 'nicht erreichbar';
}
}
Probier das mal.
Tu das an den Anfang deines Scripts.
ini_set('default_socket_timeout', 5);
$time_start = microtime(true);
while( microtime(true)-$time_start < 5){
for ($x = 0; $x <= 1000000; $x++) {
}
}
Das würde doch nicht die Schleife abbrechen, sondern sie einfach nur wiederholen wenn sie in 5 sek durch ist.
Hast du ein Beispiel für mich, wie ich der Header-Abfrage ein Timeout zuweisen kann? Wenn die nach 5 Sek. abgebrochen wird, wäre mir schon geholfen.