Frage

Zuerst

die Einrichtung:

Ich habe ein Skript, das ausgeführt wird mehrere Aufgaben nach einer vom Benutzer trifft die Schaltfläche „Hochladen“, dass das Skript die Daten sendet sie benötigen. Nun ist dieser Teil noch obligatorisch, wir haben nicht die Möglichkeit haben, an dieser Stelle, um den Upload ausgeschnitten und von einer Live-Quelle ziehen.

In diesem Abschnitt absichtlich langatmiger einen Punkt zu machen. Weiter voraus, wenn Sie hassen, dass

Im Moment ist die Daten von einer wirklich abgefahrenen Quelle analysiert werden regex, dann zerlegt in ein Array. Es prüft dann die DB für alle Daten, die bereits in den Datumsbereich der hochgeladenen Daten. Wenn die Daten Datumsbereiche existieren nicht bereits in der DB, fügt sie die Daten und gibt Erfolg an den Benutzer (es gibt auch einige Sicherheitsüberprüfungen, Datenquelle Validierung und Grund Upload Validierung) ... Wenn die Daten vorhanden ist, das Skript wird dann bereits die Daten in der DB, findet die Unterschiede zwischen den beiden Gruppen, löscht die alten Daten, die nicht fügt übereinstimmt, um die neuen Daten und sendet dann eine E-Mail an jeder Person, die von diesen Änderungen betroffen (eine Email pro Person mit allen relevanten Änderungen in der E-Mail, die eine ganz andere Stufe ist). Die E-Mail-Adressen werden mittels einer LDAP-Suche gezogen, wie unsere DB ihre Arbeit E-Mail hat aber die LDAP hat ihre persönliche E-Mail, die sie die E-Mail erhalten wird sichergestellt, bevor sie in den nächsten Tag kommen und nicht bewusst gefangen. Schließlich wird die Daten-Uploader gesagt „Änderungen vorgenommen wurden, haben E-Mails versendet.“ Das ist wirklich alles, was sie interessiert.

Jetzt kann ich die Daten ein Google Kalender-API, die Beiträge werden hinzugefügt (wenn es die Planungsdaten) an den Google Kalender des Benutzers. Ich würde es über ihre Arbeit Kalender tun, aber ich dachte, dass ich meine Zehen mit den Google-API nass bekommen würde, bevor Sie mit dem Einrichten eines WebDav-System für Exchange handelt.

</backstory>

Die praktische Frage

An diesem Punkt vorge Google-Integration, nimmt das Skript höchstens eine zweite und eine Hälfte zu laufen. Es ist ziemlich beeindruckend, zumindest glaube ich (der Server, nicht meine Codierung). Aber der Google-Bit, in Tests ist sloooow. Wir können wahrscheinlich beheben, aber es stellt sich die größere Frage ...

Was ist der beste Weg, um einen Teil der Arbeit zu entlasten, nachdem der Benutzer eine Bestätigung erhalten hat, dass die DB aktualisiert wurde? Dies ist der Teil er am meisten betreffen und das Teil am kritischsten. E-Mail-Benachrichtigungen und Google Kalender-Updates ist nur dort zum Nutzen des von dem Upload betroffen, und wenn es ein Problem mit diesen Meldungen ist, wird er es erfährt (und dann werde ich davon hören), unabhängig von dem Skript telling er zuerst.

So ist es eine Möglichkeit, zum Beispiel einen Cronjob ausführen, die durch ein Skript der letzten Ausführung ausgelöst wird? Can PHP erstellen Cronjobs mit exec() Fähigkeit? Gibt es einen normalisierte Weg nach Ausführung der Arbeit der Handhabung, dass der Bedarf immer getan?

Jede Beratung über dies ist wirklich zu schätzen. Ich fühle mich wie die Skripte aufgebläht-ness spiegelt meine Phase der Entwicklung und die Notwendigkeit für mich, endlich zu wissen, wie Division-of-Arbeit zu tun in Web-Anwendungen.

Aber ich habe auch Sorgen machen, dass dies nicht getan wird, als Benutzer wissen müssen, wenn alle Aufgaben abgeschlossen sind, usw. Also das bringt:

Die Best Practices / mehr subjektive Frage

Im Grunde ist es eine Idee, die Fortschrittsbalken, Echtzeit-Offloading und andere Möglichkeiten, den Benutzer zu halten, um das Skript gebunden sind --beim mit Optimierung des Codes kombiniert, von course-- besser die mehr bevorzugten Verfahren dann einfach sagen: „wir sind mit Ihrer Seite fertig sind, wenn Sie uns brauchen, wir Benutzer benachrichtigen sein werden“ etc etc.

Gibt es große Dinge zu vermeiden (außer natürlich nicht dem Benutzer eine Rückmeldung an alle geben)?

Vielen Dank für das Lesen. Der codierende Teil ist von entscheidender Bedeutung, so fühlen sich nicht verpflichtet, den zweiten Teil zu bedecken oder vergessen, den kodierenden Teil zu decken!

War es hilfreich?

Lösung

Es gibt eine Reihe von Möglichkeiten, um dies zu realisieren. Sie könnten () exec, wie die oben sagt, aber Sie könnten möglicherweise in eine DoS-Situation führen, wenn es zu viele Klicks einreichen. die pcntl Erweiterung ist wohl besser auf Prozesse wie diese zu verwalten. Check out dieser Beitrag eine Diskussion zu sehen (es gibt 3 Teile).

Sie könnten Javascript verwenden, um eine Sekunde zu senden, Ajax-Post, die den entsprechenden Arbeiter Skript anschließend ausgeführt wird. Durch die Verwendung von ignore_user_abort () und einen Content-Length sendet, kann der Browser trennt früh, aber die Apache-Prozess wird fortgesetzt, um Ihre Daten laufen und zu verarbeiten. Upside ist kein forkbomb Potential, Nachteil ist, es öffnet mehr Apache-Prozesse.

Eine weitere Option ist es, einen cron im Hintergrund zu verwenden, das Aussehen in einer Prozess-Queue-Tabelle für Dinge zu tun, ‚später‘ - Sie Elemente in diese Tabelle auf dem vorderen Ende bleiben, entfernen Sie sie auf dem Backend während der Verarbeitung (siehe Zend_Queue ).

Noch eine andere ist es, eine verteilte Job-Framework verwenden wie gearmand -., Welche Elemente auf anderen Maschinen verarbeiten kann

Es hängt alles von Ihren allgemeinen Fähigkeiten und Anforderungen.

Andere Tipps

Ein Cron-Job ist gut für diese. Wenn alle wollen, was Sie tun, wenn ein Benutzer lädt die Daten sagen „Hey Benutzer, vielen Dank für die Daten!“ dies wird dann in Ordnung sein.

Wenn Sie einen direkteren Ansatz bevorzugen, dann können Sie exec() verwenden, um einen Hintergrundprozess zu starten. In einer Linux-Umgebung würde es wie folgt aussehen:

exec("php /path/to/your/worker/script.php >/dev/null &");

Der & Teil sagt: "führen mich in der Backgound." Der Teil >/dev/null umleitet Ausgang mit einem schwarzen Loch. Soweit alle Fehler und anmelde entsprechende Parteien Handhabung -. Das ist alles, bis auf das Design Ihrer Arbeiter Skript

Für eine flexiblere plattformübergreifende Ansatz, lesen Sie in diesem PHP manuelle Post

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top