PHP Timeout für einzelnen for-Schleife Durchlauf oder get_headers Abfrage?

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.


Jonas8585 
Beitragsersteller
 16.02.2020, 00:13

Klasse, danke. Lese mich dann mal in aller Ruhe ein.

cURL nutzen in Verbindung mit CURLOPT_TIMEOUT. In den Kommentaren der get_headers Beschreibung findest du auch entsprechende Snippets, die dafür taugen sollten.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

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.

Woher ich das weiß:Berufserfahrung – Softwareentwicklerin

Jonas8585 
Beitragsersteller
 15.02.2020, 19:43

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.

Lamanini  15.02.2020, 19:44
@Jonas8585

Wie holst du dir denn diese Header? Hast du mal den Codeausschnitt?

Jonas8585 
Beitragsersteller
 15.02.2020, 19:54
@Lamanini

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';        
}
}
Lamanini  15.02.2020, 19:57
@Jonas8585

Probier das mal.

Tu das an den Anfang deines Scripts.

ini_set('default_socket_timeout', 5);
regex9  15.02.2020, 22:03
@Lamanini

Diese Einstellung wirkt allgemein, nicht nur auf das laufende Skript.

$time_start = microtime(true); 


while( microtime(true)-$time_start < 5){
for ($x = 0; $x <= 1000000; $x++) {
}
}
Woher ich das weiß:Studium / Ausbildung – Informatikstudent

Lamanini  15.02.2020, 18:35

Das würde doch nicht die Schleife abbrechen, sondern sie einfach nur wiederholen wenn sie in 5 sek durch ist.