2017-01-20 7 views
2

Ich versuche große Datenmengen mit PHP zu verarbeiten (100 000 000 Datensätze). Ich lade jeden Datensatz von einem anderen Server herunter, mache dann einige Textüberprüfungen und wahrscheinlich 10% der passenden Datensätze, die in meine Datenbank (MySQL) eingefügt werden. Mein Problem ist:PHP - Verarbeitung großer Datenmengen

  1. Web-Browser beendet gerade und Verarbeitung vorzeitig unterbrochen

  2. nach jedem xy checkings ich in Browser Zahl von entsprechenden Aufzeichnungen ausdrucken möchte, aber nichts gedruckt wird

MySQL ist kein Problem. Es sieht so aus, als könnte der Browser etwas drucken, nachdem das Skript beendet ist, aber ich möchte dieses Skript (Thread) für kurze Zeit unterbrechen, mein Ergebnis mit dem Browser ausdrucken und dann weitermachen. Während der Verarbeitung ist der Datenbrowser "eingefroren". Irgendwelche Ideen?

Beispiel:

for ($i=0; $i<100000000; $i++) { 
     if (($i % 1000) == 0) { //every 1000th iteration 
     echo $i;    <=== HERE I need interrupt script and let browser print my result 
     } 
    } 
+0

versuchen 'sleep()' -Funktion –

+0

Browser wird nur etwas drucken, wenn es die Ausführung beendet-- nach Abschluss dieser vielen Schleifen, aber auf CLI können Sie siehe dazu .. –

+0

Mögliche Duplikate von [PHP Hintergrundprozesse] (http://stackoverflow.com/questions/265073/php-background-processes) –

Antwort

1

Zunächst einmal ignore_user_abort ist dein bester Freund. Koppeln Sie mit set_time_limit(0) und Sie haben Ihren Prozess vor dem Absterben gesichert.

Zweitens, etwas an den Benutzer zu senden ist eine schwierige Aufgabe. Der Grund dafür ist, dass alles, was Sie ausgeben, ein paar Puffer durchläuft. Dazu gehören PHP, Apache, Load Balancer, die Ihre Anwendung verwendet, Browser usw. (Hinweis: Die Puffer können normalerweise leicht konfiguriert werden (das ist deaktiviert), aber sie sind aus einem bestimmten Grund vorhanden). Daher funktioniert die echo nicht immer.

Es gibt eine Reihe von Maßnahmen, die Sie ergreifen können, um dieses Problem zu beheben.

Eine Lösung besteht darin, Echtzeit-Kommunikationsdienste wie Pusher oder Ably zu verwenden (ich bevorzuge letztere für einen schöneren Plan) oder eine eigene Lösung mit Web-Sockets einzuführen. Dann würden Sie einfach alle 1k Iterationen eine Nachricht senden und in Ihrem JS darauf hören. Ein Bonus ist, dass, wenn der Browser des Benutzers abstürzt und er sie wieder öffnet, der Prozess und die Updates immer noch korrekt ausgeführt werden. Dies ist (meiner Meinung nach) der beste Weg, dies zu tun, aber es kann schwierig sein, richtig zu machen.

Eine andere Lösung wäre, die Daten zu teilen. Das ist JS sendet eine Ajax-Anfrage, es verarbeitet 1k Zeilen, echo s und stirbt. Dann sendet JS eine weitere Anfrage, die die nächsten 2k Zeilen verarbeitet. Dies kann einfacher geschehen, ist aber abhängig vom Client, um die Anfragen zu senden. Auch "Download jedes Datensatzes von anderen Server" kann schwierig sein mit dieser Methode

Verwandte Themen