Frage an parsing, symfony, background, php – Wie kann ich mit Symfony2 Daten im Hintergrund analysieren?

4

Ich schreibe eine Webanwendung in PHP mit Symfony2. Der Benutzer kann eine CSV-Datei mit Daten hochladen, die in der Datenbank gespeichert sind. Das Parsen jeder Zeile der CSV-Datei dauert etwa 0,2 Sekunden, da ich einige Anforderungen an die Google Maps-API stelle.

Wenn Sie also eine CSV-Datei mit 5000 Zeilen hochladen, was in meiner App ein realistischer Fall ist, kann das Parsen der gesamten Datei 16 Minuten dauern.

Ich möchte nicht, dass der Benutzer 16 Minuten warten muss, bis er meine App weiter nutzen kann. Meine Frage lautet also: Wie kann ich die CSV-Datei im Hintergrund analysieren, damit der Benutzer weiter surfen kann?

Symfony2 verfügt über keine sofort einsatzbereiten Hintergrundprozess- / Worker-Funktionen. Sie müssen also Ihre eigenen erstellen. hakre
Ich würde mich für Gearman entscheiden - einfach einzurichten und funktioniert in der Tat sehr gut mit PHP. halfer

Deine Antwort

3   die antwort
4

einen Job in eine Jobwarteschlangentabelle einzufügen, und geben Sie einBefehl regelmäßig von laufencron das erledigt jede Arbeit in der Jobwarteschlangentabelle.

Während die Verarbeitung eines Jobs fortgesetzt wird, können Sie die Jobtabelle aktualisieren, damit ein Benutzer den Fortschritt überprüfen und feststellen kann (z. B., ob eine Ajax-Statusanzeige angezeigt wird) und feststellen kann, wann der Job abgeschlossen ist.

Auf diese Weise koppeln Sie auch den Upload von der Verarbeitung ab und können steuern, wie viele Jobs gleichzeitig verarbeitet werden. Wenn lang laufende Jobs direkt über Benutzereingaben gestartet werden, ohne dass ein Drossel- / Warteschlangensystem vorhanden ist, können Sie sich auf eine Denial-of-Service-Attacke einstellen ...

Das hört sich nach einer guten Idee an. Ich werde es so versuchen. Vielen Dank :) rotespferd
1

das nur zum Verarbeiten der CSV-Datei dient, und dieses Skript über das Skript ausführen (), das den Upload verwaltet. Auf * IX-Systemen können Sie den von exec () gestarteten Befehl im Hintergrund ausführen lassen, indem Sie ein & -Zeichen anhängen.

Möglicherweise möchten Sie auch ein Skript einfügen, mit dem der Benutzer den Fortschritt der Verarbeitung überprüfen kann.

Das Ausführen eines Jobs mit langer Laufzeit über eine Webanforderung ist für mich ein Risiko. John Carter
7

kernel.terminate Ereignis-Listener und analysieren Sie dort. Dieses Ereignis wird ausgelöst, nachdem eine Antwort an den Browser gesendet wurde. Beispielimplementierung wäre,

Leistungserklärung,

//services.yml
csv_parse_listener:
    class: FQCN\Of\CsvParseListener
    tags:
        - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate }

Zuhörerklasse,

namespace Your\namespace;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;

class CsvParseListener
{
    public function onKernelTerminate(PostResponseEvent $event)
    {
        $request = $event->getRequest();
        if($request->get('_route') !== "Your_route"){
            return;
        }

        $csvFile = $request->files->get('file_field_name');

        //move file using $csvFile->move()
        //read and parse
    }
}
Meine Symfony-Version ist 2.0.15, die neueste. rotespferd
Der Fehler wurde von mir gemacht;) Aber jetzt dieonKernelTerminate Methode wird nicht aufgerufen, meine Anwendung führt den Code in dieser Methode nicht aus. Ich habe in der Akte nachgesehenvendor\symfony\src\Symfony\Component\HttpKernel\KernelEvent Es gab jedoch kein "Abbruch" -Ereignis. rotespferd
Auf der Registerkarte Ereignisse wird das Beendigungsereignis nicht angezeigt. Ich habe die Symfony Standard Edition 2.0.15 von hier:symfony.com/download. Welches verwenden Sie? Das Gleiche oder was von Github? rotespferd
Warum würde es direkt anrufen? Wenn es dann registriert istonKernelTerminate Methode wird automatisch aufgerufen. Was ist die Fehlermeldung? Mun Mun Das

Verwandte Fragen