2009-06-30 14 views
2

in Web-Anwendungen, wie verarbeite ich die Verarbeitung großer Datenmengen, die normalerweise Timeouts verursachen? z.B. eine db verarbeiten, um einen großen Bericht auszugeben? Ich verwende normalerweise PHP/Zend Framework/MySQL.WebApps: Vermeiden Sie Timeout bei der Verarbeitung großer Datenmengen

+0

Auch wenn ich eine Antwort geschrieben, kann ich gesprungen die Waffe Hier. Eine allgemeine Frage: Was genau ist das Timing? Das PHP-Skript oder die DB? Zum Beispiel, wenn die DB schnell eine Tonne Daten zurückgibt, dann ist Ihr Problem im Skript, nicht in der DB, und andere Lösungen sind notwendig als das, was ich unten vorgestellt habe. – alphadogg

+0

Ich denke, es ist PHP aus. Ich denke, wenn ich Timeout sage ich PHP/ASP Timeouts, die behoben werden kann, indem Skript Timeout oder maximale Ausführungszeit zu verlängern. – iceangel89

Antwort

1

ich in der Regel die Aufgabe asynchron ausgeführt werden würde - ich glaube, Sie so etwas wie dies in PHP verwenden kann:

exec ("/usr/local/bin/php build_report.php") 
+0

hmm ich sah gerade die PHP-Exec-Dokumente. noch nicht wirklich klar. Wird das PHP-Timeout vermieden? und um async zu sein, muss ich den Benutzer zu einer Datei isit umleiten? oder wird es dort hängen, bis es fertig ist? wie exec (...); Kopfzeile ("Ort: ..."); ist es? Was passiert, wenn es wie nie beendet wird, wenn das Timeout nicht gilt? – iceangel89

2

Asynchrone Mechanismen verschiedener Art. B. den Job in einer Jobtabelle in eine Warteschlange stellen und eine automatisierte Aufgabe im Hintergrund haben, die Tabelle nach einem festen Zeitplan für neu hinzugefügte Jobs abfragen, sie verarbeiten und den Benutzer irgendwie benachrichtigen.

In einer aktuellen App muss ein Dokument, das Benutzer generieren müssen, tatsächlich auf einer Seite angefordert werden. Dies führt einfach dazu, dass eine Zeile in eine Jobtabelle eingefügt wird. In regelmäßigen Abständen wird ein Ereignis ausgeführt, das alle erforderlichen SQL-Anweisungen ausführt, um die Daten des Dokuments in einer zweiten Tabelle zu erstellen. Ein dritter Schritt ist eine PHP-Seite, die ausstehende/abgeschlossene Dokumente anzeigt. In diesem Fall gibt es keine wirkliche Turnaround-Anforderung, so dass die Leute nicht aktiv per E-Mail oder einem solchen Mechanismus benachrichtigt werden, aber es wäre einfach, dies alles zu überlagern.

Es gibt eine Million Möglichkeiten, um diese Katze zu Haut ...

+0

ich weiß .NET hat MSMQ/WCF für die Warteschlange, aber ich glaube nicht, dass es für PHP hmm? ist es? "und irgendwie den Benutzer benachrichtigen, dass es getan wurde" irgendwelche Ideen, wie dieser Teil getan werden kann? Du sprichst von diesem Job? Wie kann ich es so ausführen, dass es nicht von Timeout betroffen ist? läuft nicht in PHP? – iceangel89

+0

Eigentlich halte ich die Dinge einfacher. Eine Jobanforderung ist eine einzelne INSERT in eine Jobtabelle in der Datenbank. MySQL hat Ereignisse, die wie Jobs in SQL Server sind, und ich plane mit diesen. Oder, für alte Versionen von MySQL, würden Sie Cron verwenden. Eine oder mehrere SQL-Anweisungen (eingeschlossen in einem Ereignis-, Job- oder anderen Mechanismus) erstellen relevante Daten in einer Ausgabetabelle. Auf einer zweiten PHP-Seite können Benutzer den Fortschritt dieser Jobs anzeigen. – alphadogg

+0

Oh, und "Benachrichtigung" kann viele Formen annehmen. Im Allgemeinen ist es E-Mail, obwohl ich einmal in eine Unternehmens-IM aufgebockt habe. Auch dies ist normalerweise eine weitere geplante Aufgabe. Zum Beispiel könnte ein Cron-Job ein PHP-Skript ausführen, das Dokumente versendet, die als vollständig markiert, aber noch nicht gesendet wurden. – alphadogg

0

set_time_limit (int $seconds ) Ihnen erlauben würde, die Frist für die Ausführung zu ändern und Sie können es wieder normal zurückgesetzt, wenn Sie die Skripts fertig ausgeführt werden, die eine länger dauern Zeit zur Ausführung.

+0

Seien Sie vorsichtig. Ich benutze diese Idee auch, aber heb sie nicht hoch, denn die Nutzer werden nur so lange warten, bis sie frustriert sind. Der PHP-Standard ist bereits 30 Sekunden lang (entsprechend dem typischen Geschäftsbenutzer). Über 2 Minuten hinaus, und Sie müssen sich fragen, ob Benutzer so lange warten, ist der richtige Weg, um für das Problem zu entwerfen ... – alphadogg

+0

hmm, aber wenn dieser Bericht bei Bedarf gemacht werden muss, muss ich das für immer festlegen, Was ist vielleicht eine gute Sache isit?Kann es das System zu lange "auflegen"? Ich denke? – iceangel89

+0

Hängt vom Skript ab. Wenn das Skript anfordert, eine große Menge von Daten in der Datenbank in einem kleinen Betrag für die Anzeige zu verarbeiten, dann im Allgemeinen keine. Wenn Sie jedoch ein komplexes Skript oder eine große Menge an Rückgabedaten haben, gibt es viele potenzielle Probleme. Es gibt sehr wenige Male, in einer Business-Line-App, wo ein Benutzer einfach keine andere Arbeit überhaupt tun kann, bis ein intensiver Bericht von einem Server abgeschlossen ist ... – alphadogg

1

Während der serverseitige Code die Daten verarbeitet, muss der Client den Server regelmäßig abfragen, um seine Sitzung am Leben zu erhalten. Wenn Sie den Server nicht regelmäßig abfragen, wird Ihre HTTP-Sitzung möglicherweise ablaufen und einen Zeitüberschreitungsfehler verursachen.

+0

oh fragt der Server regelmäßig Zeitüberschreitung verhindern? wie mache ich das? – iceangel89

1

Eine Sache, die Sie tun können, ist den Ausgabepuffer zu leeren, dann senden Sie etwas Javascript, um einen Fortschrittsbalken während Ihrer Verarbeitung zu aktualisieren. Hier ein Beispiel:

<html> 
<body> 
<div id="progressBar" style="width: 0px; height: 20px; background: #900; color: #fff;">Progress</div> 
</body> 
</html> 
<? 

while(@ob_end_flush()); 

for ($i = 0; $i < 10; $i++) { 

    echo "<script type=\"text/javascript\">var pb = document.getElementById('progressBar'); pb.style.width = '" . ($i * 20) . "px';</script>"; 
    sleep(1); 
} 

?> 
+1

Dies funktioniert gut, wenn im Allgemeinen a) die DB reagiert und b) wenn der gesamte Job nicht länger als 1-3 Minuten dauert. (Das ist meine eigene Faustregel basierend auf der Interaktion mit verschiedenen Benutzern.) Wenn die Daten übermäßig sind, das Skript komplex ist und/oder die Gesamtreaktionszeit meine persönliche Regel überschreitet, unterteile ich die Schnittstelle in einen Start-Job/Get -result Paar Seiten. – alphadogg

Verwandte Themen