2 Stimmen

Verlagerung von Skriptfunktionen in den Post-Response-Bereich: Methoden und bewährte Praktiken?

Erstens,

die Einrichtung:

Ich habe ein Skript, das mehrere Aufgaben ausführt, nachdem ein Benutzer auf die Schaltfläche "Hochladen" geklickt hat, die dem Skript die benötigten Daten übermittelt. Dieser Teil ist derzeit obligatorisch. Wir haben derzeit nicht die Möglichkeit, den Upload auszuschalten und von einer Live-Quelle zu beziehen.

Dieser Abschnitt ist absichtlich langatmig, um etwas zu verdeutlichen. Überspringen Sie ihn, wenn Sie das hassen

Im Moment werden die Daten aus einer wirklich seltsamen Quelle mit Regex geparst und dann in ein Array aufgeteilt. Dann wird die DB auf Daten überprüft, die bereits im Datumsbereich der hochgeladenen Daten liegen. Wenn die Daten Datumsbereiche nicht bereits in der DB vorhanden sind, fügt es die Daten ein und gibt den Erfolg an den Benutzer aus (es gibt auch einige Sicherheitsprüfungen, Datenquellenüberprüfung und grundlegende Upload-Validierung)... Wenn die Daten vorhanden sind, ruft das Skript die bereits in der DB vorhandenen Daten ab, findet die Unterschiede zwischen den beiden Datensätzen, löscht die alten Daten, die nicht übereinstimmen, fügt die neuen Daten hinzu und sendet dann eine E-Mail an jede Person, die von diesen Änderungen betroffen ist (eine E-Mail pro Person mit allen relevanten Änderungen in dieser E-Mail, was ein ganz anderer Schritt ist). Die E-Mail-Adressen werden über eine LDAP-Suche ermittelt, da unsere DB über die Arbeits-E-Mails der Mitarbeiter verfügt, das LDAP jedoch ihre persönlichen E-Mails enthält. So wird sichergestellt, dass die Mitarbeiter die E-Mail erhalten, bevor sie am nächsten Tag nach Hause kommen und von den Änderungen überrascht werden. Schließlich wird dem Daten-Uploader mitgeteilt: "Die Änderungen wurden vorgenommen, die E-Mails wurden versandt", und das ist auch schon alles, was ihn interessiert.

Jetzt füge ich möglicherweise eine Google Calendar API hinzu, die die Daten (wenn es sich um Planungsdaten handelt) in den Google-Kalender des Benutzers überträgt. Ich würde es über den Arbeitskalender des Nutzers machen, aber ich dachte, ich würde mich erst einmal mit der Google-API vertraut machen, bevor ich ein WebDav-System für Exchange einrichte.

</backstory>

Jetzt!

Die praktische Frage

Zu diesem Zeitpunkt, also vor der Google-Integration, dauert die Ausführung des Skripts höchstens eineinhalb Sekunden. Das ist ziemlich beeindruckend, zumindest denke ich das (der Server, nicht meine Programmierung). Aber der Google-Teil in den Tests ist SLOOOOW. Wir können das wahrscheinlich beheben, aber das wirft die größere Frage auf...

Wie lässt sich ein Teil der Arbeit am besten auslagern, nachdem der Benutzer die Bestätigung erhalten hat, dass die DB aktualisiert worden ist? Das ist der Teil, um den er sich am meisten kümmert und der am kritischsten ist. E-Mail-Benachrichtigungen und Google-Kalender-Updates sind nur für diejenigen da, die vom Upload betroffen sind, und wenn es ein Problem mit diesen Benachrichtigungen gibt, wird er davon erfahren (und dann erfahre ich davon), unabhängig davon, ob das Skript es ihm zuerst mitteilt.

Gibt es zum Beispiel eine Möglichkeit, einen Cronjob auszuführen, der durch die letzte Ausführung eines Skripts ausgelöst wird? Kann PHP Cronjobs erstellen mit exec() Fähigkeit? Gibt es ein normales Verfahren für den Umgang mit der Arbeit nach der Ausführung, die erledigt werden muss?

Für jeden Ratschlag zu diesem Thema bin ich sehr dankbar. Ich fühle mich wie die Skripte aufgeblasen-ness spiegelt mein Stadium der Entwicklung und die Notwendigkeit für mich, endlich wissen, wie man Arbeitsteilung in Web-Anwendungen zu tun.

Aber ich mache mir auch Sorgen, dass dies nicht getan wird, da die Benutzer wissen müssen, wann alle Aufgaben abgeschlossen sind usw. Das wirft also Fragen auf:

Die Frage nach den besten Praktiken/mehr Subjektivität

Besteht grundsätzlich die Vorstellung, dass Fortschrittsbalken, Echtzeit-Offloads und andere Möglichkeiten, den Benutzer an das Skript zu binden, - natürlich in Verbindung mit einer Optimierung des Codes - die bessere, bevorzugte Methode sind, als einfach zu sagen: "Wir sind mit Ihrem Teil fertig, wenn Sie uns brauchen, werden wir die Benutzer benachrichtigen" usw. usw.

Gibt es irgendwelche GROSSEN Dinge, die man vermeiden sollte (abgesehen davon, dass man dem Benutzer natürlich überhaupt kein Feedback geben sollte)?

Vielen Dank für die Lektüre. Der Codierungsteil ist entscheidend, also fühlen Sie sich nicht verpflichtet, den zweiten Teil zu behandeln oder den Codierungsteil zu vergessen!

2voto

hlpiii Punkte 161

Hierfür eignet sich ein Cron-Job. Wenn alles, was Sie tun wollen, wenn ein Benutzer Daten hochlädt, ist zu sagen: "Hey, Benutzer, danke für die Daten", dann ist das in Ordnung.

Wenn Sie einen direkteren Ansatz bevorzugen, können Sie exec() um einen Hintergrundprozess zu starten. In einer Linux-Umgebung würde das etwa so aussehen:

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

En & Ein Teil sagt: "Ich werde von hinten angegriffen." Die >/dev/null Teil die Ausgabe in ein schwarzes Loch umleitet. Was die Behandlung von Fehlern und die Benachrichtigung der zuständigen Stellen betrifft, so hängt dies alles von der Gestaltung Ihres Arbeitsskripts ab.

Für einen flexibleren, plattformübergreifenden Ansatz, schauen Sie sich diese PHP Manual post

1voto

Justin Punkte 4899

Es gibt verschiedene Möglichkeiten, dies zu tun. Sie könnten exec(), wie die oben sagt, aber Sie könnten potenziell in eine DoS-Situation laufen, wenn es zu viele Submit-Klicks sind. die pcntl-Erweiterung ist wohl besser bei der Verwaltung von Prozessen wie diese. Schauen Sie sich diese Stelle um eine Diskussion zu sehen (es gibt 3 Teile).

Sie könnten Javascript verwenden, um einen zweiten Ajax-Post zu senden, der anschließend das entsprechende Worker-Skript ausführt. Durch die Verwendung von ignore_user_abort() und das Senden einer Content-Length kann der Browser die Verbindung frühzeitig abbrechen, aber Ihr Apache-Prozess läuft weiter und verarbeitet Ihre Daten. Der Vorteil ist, dass keine Forkbomben entstehen können, der Nachteil ist, dass mehr Apache-Prozesse geöffnet werden.

Eine weitere Möglichkeit ist die Verwendung eines Cron im Hintergrund, der eine Prozess-Warteschlangentabelle nach "später" zu erledigenden Aufgaben durchsucht - Sie fügen Elemente in diese Tabelle am Frontend ein und entfernen sie am Backend während der Verarbeitung (siehe Zend_Queue ).

Eine weitere Möglichkeit ist die Verwendung eines verteilten Auftragsrahmens wie gearmand - die Gegenstände auf anderen Maschinen verarbeiten können.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X