while Schleife zeitgesteuert abbrechen

Sprint

Erfahrenes Mitglied
Hallo zusammen,

in meinem aktuellen Projekt ist auch eine Suchfunktion, die per Ajax den Suchauftrag rausschickt und wieder empfängt. Nun kann es sein, daß bei sehr allgemeinen Suchbegriffen die Suchroutine in einen Timeout läuft. Das bekommt Ajax ja aber nicht mit, so daß es am Client so lange ergebnislos läuft, bis der User entnervt aufgibt.

Nun habe ich versucht, in der while Schleife, in der die gefundenen DB Einträge verarbeitet werden, per Zeitabfrage einen Abbruch erzeugen.
PHP:
$startzeit = time();
while($zeile = mysqli_fetch_array($erg, MYSQLI_ASSOC)){
    if (time() - $startzeit > 60)
        break;
}
Das interessiert die Schleife aber nicht. Die rennt munter weiter, bis sie ein Ergebnis hat oder gegen die Zeitmauer rennt.
Habe ich da irgendwo einen Denkfehler drin oder wie könnte man sonst die Schleife nach einer gewissen Zeit abbrechen?
 

Sempervivum

Erfahrenes Mitglied
Ich denke, die Fetch-Operation fällt gegenüber dem Lesen aus der Datenbank nicht ins Gewicht und der Timeout tritt schon auf, bevor das Skript an diese Stelle kommt.
 

Sprint

Erfahrenes Mitglied
Nein, bei unserem Server liegt das Timeout bei 5 Minuten und ich habe testweise die Grenze auf 60 Sekunden gesetzt. In der Schleife passiert ja auch noch einiges mehr, so daß je nach Suchbegriff schon mal mehrere Minuten zusammen kommen können. Das Script hier ist nur zur Erklärung, wie der Abbruch passieren soll.
 

Yaslaw

n/a
Moderator
Du solltestdas im JavaScript abfangen. Das läuft unabhängig der DB-Abfrage.
Das Problem bei deinem Code ist, dass der grosse Zeitfresser meistens das Ausführen des SQL ist, nicht der Fetch danach. So wie Sempervivum auch schreibt.

Ansonsten stimmt die Logik. Du hast da aber viel mehr Code, schreibst du. Bist du sicher, dass die richtige Schleife mit break verlassen wird?
 

Sprint

Erfahrenes Mitglied
Ansonsten stimmt die Logik. Du hast da aber viel mehr Code, schreibst du. Bist du sicher, dass die richtige Schleife mit break verlassen wird?
Ja, es gibt nur diese eine Schleife. Da drin wird nur die Rückgabe an den Client aufbereitet.

Mir ist es aber früher schon mal aufgefallen, daß solche Abbrüche über Zeitabfrage sehr unsicher sind. Damals ging es um die nachträgliche Verschlüsselung von Dateien. Insgesamt lief das rund 12 Stunden und es sollte immer nach 4.30 Minuten abgebrochen und neu aufgerufen werden. Oftmals hat es funktioniert, manchmal aber eben auch nicht.

Ich werde das testweise mal in eine Datei schreiben lassen. Mal sehen, was dabei rauskommt.
 

Sprint

Erfahrenes Mitglied
Ich bin der Sache auf die Spur gekommen. Das Problem des Nicht-Abbruchs tritt dann auf, wenn der Query selbst schon mehr als 5 Minuten braucht. Damit hatte ich allerdings nicht gerechnet, so daß ich vorher nie auf die Idee gekommen war.
 

Yaslaw

n/a
Moderator
Darum mein Vorschlag, das ganze im Javascript zu lösen....

Nachtrag: ALternativ kannst du deine DB-Anfrage in einen eigene PHP-Thread laufen lassen und paralell dazu deine Timeoutsteuerung. Ich bin da aber auch nicht so bewandert damit.

PHP: Thread - Manual
 
Zuletzt bearbeitet: