Ich habe eine PHP-App erstellt, und ich habe gelesen, dass es eine bewährte Vorgehensweise ist, einen 'Worker' + Queue-Server zu verwenden, wenn man api aufruft oder Operationen ausführt, die zeitaufwendig sind.
Eine schnelle Suche nach einem Tutorial ist trocken geworden. Ich habe meine App mit codeigniter gebaut, und ich mache verschiedene Anrufe an die Facebook API + benutze PHP-basierte Bildbearbeitung in meiner App. Das einzige, was ich frage mich ist, wie könnte ein Warteschlange Server + Arbeiter mir helfen, wenn ich api Anrufe oder Größenanpassung meiner Bild und der Benutzer würde normalerweise keine Antwort von meinem Server zurück, bis es abgeschlossen ist.
Welche Situationen wären gute Kandidaten für einen Worker + Queue-Server, und gibt es dort Anleitungen, diese in meine Anwendung aufzunehmen? Vor kurzem habe ich Memcache in meine App aufgenommen, ein Vorgang, der trivialerweise einfach war. Ich habe meine SQL-Abfragen einfach mit einem Memcache-Handler umschlossen.
In dem von Ihnen beschriebenen Beispiel (Bildgrößenanpassung) halten Sie grundsätzlich eine Apache-Verbindung für die Dauer der Größenänderung Ihres Bildes offen. Apache-Prozesse sind teuer und um Ihr System so skalierbar wie möglich zu machen, sollten Sie darauf achten, dass Ihre Web-Anfragen / Antworten so kurz wie möglich gehalten werden. Die andere Idee ist, dass Sie mit einer Warteschlange die Nebenläufigkeit steuern können. Was ist, wenn mehr als 100 Nutzer gleichzeitig ein Bild hochladen, um ihre Größe zu ändern? Kann Ihr Server damit umgehen? Wenn Sie einen Worker-Server (Backend-Server) zum Verarbeiten dieser Anforderungen hätten, könnten Sie die Ausführung von nur X-gleichzeitigen Jobs zulassen.
Gleiches gilt für Web-Service-Anfragen: Anstatt eine Verbindung zu haben, die offen bleibt, entlädst du im Grunde die Ausführung des Web-Service-Aufrufs an einen Worker-Prozess, wodurch ein Apache-Prozess frei wird und du einen AJAX-Polling-Mechanismus implementieren kannst überprüft, ob die Anfrage, die der Backend-Server an den Web-Service gestellt hat, abgeschlossen ist. Auf lange Sicht wird das System besser skalieren, und die Benutzer warten in der Regel nicht darauf, auf eine Operation zu warten, die keine Rückmeldung darüber gibt, wo sie ist. Queuing ermöglicht es Ihnen, eine Aufgabe asynchron auszuführen und Ihrem Besucher Feedback darüber zu geben, wo der Abschlussstatus einer Aufgabe liegt.
Ich arbeite normalerweise mit der Jobwarteschlange von Zend Server ( Ссылка und Ссылка ), das mit Zend Server Vollversion (kommerziell) verfügbar ist. Allerdings ist Gearman auch hervorragend dabei und hat eine PHP-Erweiterung: Ссылка und ein Beispiel: Ссылка .
Hoffe, das hilft.
- BEARBEITEN -
@Casey, ich habe angefangen, einen Kommentar hinzuzufügen, aber mir ist klar geworden, dass dies schnell zu lange werden wird, also habe ich stattdessen die Antwort bearbeitet. Ich habe gerade das Dokument zur Cloud-Kontrolle gelesen, ein Dienst, den ich nicht kannte. Zum Glück habe ich Codeigniter ziemlich ausgiebig benutzt, also werde ich versuchen, eine Antwort für Sie zu hacken:
1- Cloudcontrols Konzept eines Arbeiters besteht darin, ein PHP-Skript über die Befehlszeile zu starten. Daher benötigen Sie einen Weg, damit Codeigniter ein Skript von der Befehlszeile aus starten und es an einen Controller senden kann. Sie werden das wahrscheinlich auf einen Controller beschränken wollen. Siehe den Code unter: Ссылка
Diese Datei macht im Wesentlichen die CI-Datei index.php, außer dass sie eine Anfrage durch Setzen von $_REQUEST['SERVER_URI']
emuliert. Stellen Sie sicher, dass Sie diese Datei außerhalb Ihres Dokumentstammverzeichnisses platzieren, und passen Sie die Variable $system_folder
entsprechend an.
2- Sie benötigen eine Controller script.php in Ihrem Controller-Ordner, von der Sie Web-Anfragen deaktivieren. Sie können etwas mit folgendem Effekt tun:
%Vor%3- Das letzte Stück ist für Sie die Entwicklung einer Wrapper-Bibliothek in CI (im Ordner system / application / libraries), die die Funktionalität des CloudController-Worker-Aufrufs effektiv umschließt
%Vor%4- Jetzt von überall in Ihrem Code, wo Sie einen Job tatsächlich einreihen möchten, wenn von einem Controller:
%Vor% Bitte beachten Sie:
1- Das könnte weiter poliert werden, es war wirklich, Ihnen eine Idee davon zu geben, wie es gemacht werden könnte
2- Da ich keinen cloudcontroller-Account habe, kann ich den Code nicht testen, daher muss er optimiert werden. Das Utilities.phph-Skript, das ich in meinen Projekten verwende, sollte also gut sein.
Viel Glück!
Wenn Sie keine dedizierte Worker / Queue-Serverkonfiguration benötigen, können Sie eine kleine Bibliothek für Ihre Codeigniter-Installation erstellen, um eine einfache Arbeitswarteschlange zu verwalten.
Während der ersten Client-Anforderung prüfen Sie, ob das generierte Abbild oder die Remote-Datei im Cache nicht (erneut) generiert werden muss und die Dateien bereitstellen. Wenn die Datei oder das Image erstellt werden muss, weisen Sie die Warteschlangenbibliothek an, sie der Warteschlange hinzuzufügen, und schließen Sie dann die Verbindung zum Browser. Allerdings verarbeiten Sie die Warteschlange am Ende Ihres Controllers während derselben Anfrage weiterhin. Auf diese Weise benötigen Sie keine separate Warteschlange und keinen Worker-Server.
Für mich waren die Kommentare auf Ссылка sehr hilfreich. Sie tun im Wesentlichen Folgendes: ( proof of concept, siehe Link für Details )
%Vor%Während der Entwicklung und des Debuggens können Sie den Bereich für die Verbindungsherstellung vorübergehend deaktivieren und eine Ausgabe anzeigen. Für die Produktion könnten Sie log_message () verwenden.
Warteschlangenbibliotheksfunktion ( Anmerkungen zu coder / self ): Wenn eine Datei zur Warteschlange hinzugefügt wird, sollte die Warteschlangenbibliothek prüfen, ob die Datei bereits vorhanden ist die Warteschlange. Da in diesem Setup die Worker asynchron ausgeführt werden (viele verschiedene Browserverbindungen), sollte der Jobstatus bei der Verarbeitung eines Jobs durch einen Worker auf "Verarbeitung" gesetzt werden, damit kein anderer Worker mit dem gleichen Job arbeitet . Alternativ können Sie eine sequenzielle Warteschlange einrichten, indem Sie den Status der gesamten Warteschlange auf "Queue-is-processing" (jeweils einen Worker) festlegen. Timeouts für Jobs (oder für die Gesamtwarteschlange) sind wahrscheinlich ebenfalls eine gute Idee und das Timeout sollte etwas größer als set_time_limit () sein. Auf diese Weise können Sie wissen, wann ein Job fehlgeschlagen ist, und ein Fehlerprotokoll aktualisieren. Bearbeiten Sie Warteschlangenaufreinigungen frühzeitig, um sicherzustellen, dass sie verarbeitet werden und nicht außerhalb eines Zeitlimits liegen.
Hinweis : Wenn Sie auf der gleichen verlinkten Seite auf Dateien im lokalen Dateisystem reagieren und gleichzeitig ignore_user_abort (true) oder register_shutdown_function () verwenden möchten, sollten Sie sie speichern das Arbeitsverzeichnis zuerst. $ cwd = getcwd ();
bearbeiten:
einen guten Ausgangspunkt für eine Job-Bibliothek gefunden:
Ссылка
Tags und Links php worker web-worker