Heim >Backend-Entwicklung >PHP-Tutorial >Verwenden der Hintergrundverarbeitung, um die Seitenladezeiten zu beschleunigen
Kernpunkte
Dieser Artikel ist Teil einer Reihe von Artikeln zum Erstellen von Beispielanwendungen (Multi-Bild-Blog) für Leistungsbenchmarking und Optimierung. (Zeigen Sie die Codebasis hier an)
In früheren Artikeln fügten wir On-Demand-Bildskalierungsfunktionen hinzu. Die Bilder werden für die spätere Verwendung skaliert und zwischengespeichert, wenn sie zum ersten Mal angefordert werden. Dies ist praktisch, erhöht aber auch den Overhead des ersten Ladens.
Die Optimierungslösung besteht darin, nach dem Erstellen der Galerie Miniaturansichten zu rendern. Sie denken vielleicht: "Okay, aber dies wird den Benutzer blockieren, der die Galerie erstellt hat?" Benutzer werden über längere Ladezeiten verwirrt, oder schlimmer noch, wenn das Bild zu groß ist, um zu verarbeiten, werden Sie auf ein Timeout und/oder einen Fehler stoßen. Die beste Lösung besteht darin, diese schweren Aufgaben auf den Hintergrund zu verschieben.
Hintergrundaufgaben
Hintergrundaufgaben sind der beste Weg, um alle schweren Aufgaben zu erledigen. Wir können den Benutzer sofort mitteilen, dass wir seine Anfrage erhalten haben und die Verarbeitung arrangieren. Gleiches gilt für YouTube zum Hochladen von Videos: Das Video ist nach dem Hochladen nicht zugegriffen. Benutzer müssen warten, bis das Video vollständig verarbeitet wird, bevor die Vorschau oder Freigabe geteilt wird.
Verarbeiten oder Generieren von Dateien, Senden von E-Mails oder andere nicht kritische Aufgaben sollten im Hintergrund ausgeführt werden.
wie man in der Backend -Verarbeitung arbeitet
Die Hintergrundverarbeitungsmethode enthält zwei Schlüsselkomponenten: Task -Warteschlange und Arbeitsprozess. Die Anwendung erstellt Aufgaben, die bearbeitet werden müssen, während der Arbeiter wartet und jeweils eine Aufgabe aus der Warteschlange erhält.
Sie können mehrere Arbeitsprozesse (Prozesse) erstellen, um die Verarbeitung zu beschleunigen, große Aufgaben in kleinere Stücke zu zerlegen und gleichzeitig zu verarbeiten. Sie können die Backend -Verarbeitung entsprechend Ihren Anforderungen organisieren und verwalten. Beachten Sie jedoch, dass die parallele Verarbeitung keine leichte Aufgabe ist: Sie sollten potenzielle Rennbedingungen achten und fehlgeschlagene Aufgaben anmutig erledigen.
Unser Technologiestapel
Wir verwenden die Warteschlange für BeaneStalkd -Task, um Aufgaben zu speichern, die Symfony -Konsolenkomponente zu verwenden, um den Arbeitsprozess als Konsolenbefehl zu implementieren und den Supervisor zu verwenden, um den Arbeitsprozess zu verwalten.
Wenn Sie Homestead verbessert verwenden, werden Beantalkd und Supervisor installiert, sodass Sie die folgenden Installationsanweisungen überspringen können.
instalkd
BeAnstalkd ist eine schnelle Warteschlange mit einer gemeinsamen Schnittstelle, die ursprünglich so konzipiert wurde, dass sie die Latenz beim Surfen in den Webanwendungen mit hohem Verkehrsanwendungen reduzieren, indem zeitaufwändige Aufgaben asynchron ausgeführt werden.
Sie können viele verfügbare Client -Bibliotheken verwenden. In unserem Projekt verwenden wir PheAnstalk.
Um beanstalkd auf Ihrem Ubuntu- oder Debian -Server zu installieren, führen Sie einfach sudo apt-get install beanstalkd
aus. Schauen Sie sich die offizielle Download -Seite an, um zu erfahren, wie Sie BeaneStalkd auf anderen Betriebssystemen installieren.
Nach der Installation beginnt BeaneStalkd als Daemon und wartet darauf, dass der Client eine Verbindung herstellt und den Job erstellt (oder verarbeitet):
<code>/etc/init.d/beanstalkd Usage: /etc/init.d/beanstalkd {start|stop|force-stop|restart|force-reload|status}</code>
als Abhängigkeit durch Ausführen von composer require pda/pheanstalk
als Abhängigkeit installieren.
Die Warteschlange wird verwendet, um Jobs zu erstellen und abzurufen. Deshalb zentralisieren wir die Schaffung von Arbeitsplätzen in einem Werksdienst: JobQueueFactory
<code class="language-php"><?php namespace App\Service; use Pheanstalk\Pheanstalk; class JobQueueFactory { private $host = 'localhost'; private $port = '11300'; const QUEUE_IMAGE_RESIZE = 'resize'; public function createQueue(): Pheanstalk { return new Pheanstalk($this->host, $this->port); } }</code>Jetzt können wir Fabrikdienste nach Bedarf injizieren, um mit der Warteschlange mit Beanstalkd zu interagieren. Wir definieren den Warteschlangenname als Konstante und verweisen auf ihn, wenn wir den Job in die Warteschlange einfügen oder die Warteschlange im Arbeitsprozess überwachen.
Installieren von Supervisor
gemäß der offiziellen Seite ist Supervisor ein Client/Server -System, mit dem die Benutzer viele Prozesse auf dem UNIX -Betriebssystem überwachen und steuern können.Wir werden es verwenden, um Arbeitsprozesse zu starten, neu zu starten, zu erweitern und zu überwachen.
Der Supervisor auf Ihrem Ubuntu/Debian -Server installieren, indem Sie
ausführen. Nach der Installation wird der Supervisor als Daemon im Hintergrund ausgeführt. Verwenden Sie sudo apt-get install supervisor
, um den Vorgesetztenprozess zu steuern: supervisorctl
<code>$ sudo supervisorctl help default commands (type help <topic>): </topic>===================================== add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop version</code>Um den Supervisor zu verwenden, um einen Prozess zu steuern, müssen wir zunächst eine Konfigurationsdatei schreiben und beschreiben, wie wir unseren Prozess steuern möchten. Die Konfiguration wird in
gespeichert. Eine einfache Supervisor -Konfiguration für die Größe von Arbeitsprozessen ist wie folgt: /etc/supervisor/conf.d/
<code>[program:resize-worker] process_name=%(program_name)s_%(process_num)02d command=php PATH-TO-YOUR-APP/bin/console app:resize-image-worker autostart=true autorestart=true numprocs=5 stderr_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stderr.log stdout_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stdout.log</code>Wir sagen Supervisor, wie der generierte Prozess, der Pfad zu den ausführenden Befehlen, der Prozess automatisch gestartet und neu gestartet wird, wie viele Prozesse wir wollen und wo die Ausgabe aufzeichnet. Erfahren Sie hier mehr über die Konfiguration der Supervisor.
Die Größe des Bildes im Hintergrund
GrößeSobald unsere Infrastruktur eingerichtet ist (d. H. Beantalkd und Supervisor installiert sind) können wir unsere Anwendung ändern, um das Bild im Hintergrund nach dem Erstellen der Galerie zu ändern. Dazu brauchen wir:
ImageController
Aktualisieren Sie das Gerät und ändern Sie das Bild in der Geräteklasse.
Bilddienste logik
aktualisieren
ImageController
Bisher haben wir das Bild in der ersten Anfrage angegriffen: Wenn die angeforderte Bilddatei nicht vorhanden ist, wird es dynamisch erstellt.
Wir werden nun
so ändern, dass die angeforderte Bildantwort zurücksetzt, wenn die geeignete Bilddatei vorgenommen wurde (d. H. Das Bild wurde geändert).
GalleryCreatedEvent
Wenn es nicht vorhanden ist, gibt die Anwendung eine allgemeine Platzhalter -Bildantwort zurück, die angibt, dass das Bild geändert wird. Beachten Sie, dass die Platzhalter -Bildreaktion unterschiedliche Cache -Steuerelemente enthält, da wir das Image des Platzhalters nicht zwischendurchschnittlich sind. UploadController
<code>/etc/init.d/beanstalkd Usage: /etc/init.d/beanstalkd {start|stop|force-stop|restart|force-reload|status}</code>mit der Nutzlast als Galerie -ID. Nachdem die Galerie erfolgreich erstellt wurde, wird diese Veranstaltung in
: versandt
Zusätzlich aktualisieren wir die Flash -Nachricht mit "Bilder werden jetzt verarbeitet." GalleryEventSubscriber
GalleryCreatedEvent
Wir erstellen
<code class="language-php"><?php namespace App\Service; use Pheanstalk\Pheanstalk; class JobQueueFactory { private $host = 'localhost'; private $port = '11300'; const QUEUE_IMAGE_RESIZE = 'resize'; public function createQueue(): Pheanstalk { return new Pheanstalk($this->host, $this->port); } }</code>reagieren und die Größe der Größe für jedes Bild in der neu erstellten Galerie anfordern:
Wenn der Benutzer nun die Galerie erfolgreich erstellt, wird die Anwendung die Galerie -Seite rendern, die Miniaturansichten einiger Bilder sind jedoch noch nicht fertig, sodass sie nicht angezeigt werden:
Sobald der Arbeitsprozess abgeschlossen ist, sollte die vollständige Galerie -Seite als nächstes aktualisiert werden.
Implementieren Sie den Prozess der geeigneten Worker als Konsolenbefehl $queue->reserve()
-Anruf blockiert, bis der Arbeiter den Auftrag behält oder eine Zeitüberschreitung auftritt.
Nur ein Arbeiterprozess kann Jobs erhalten und verarbeiten. Jobs enthalten normalerweise Nutzlasten wie Zeichenfolgen oder serialisierte Arrays/Objekte. In unserem Beispiel wird es die UUID der erstellten Galerie sein.
Ein einfacher Arbeiter sieht so aus:<code>/etc/init.d/beanstalkd Usage: /etc/init.d/beanstalkd {start|stop|force-stop|restart|force-reload|status}</code>
Sie haben möglicherweise festgestellt, dass der Arbeitsprozess nach einem definierten Ausgleich oder nach einer Arbeit bearbeitet wird. Wir können die Arbeitsprozesslogik in eine unendliche Schleife einwickeln und ihre Jobs auf unbestimmte Zeit wiederholen. Dies kann jedoch zu Problemen wie der Zeitüberschreitung von Datenbankverbindungen nach langer Inaktivität und schwierigerer Bereitstellung führen. Um dies zu verhindern, endet unser Arbeitsprozesslebenszyklus nach Abschluss einer einzigen Aufgabe. Der Supervisor startet dann den Arbeitsprozess als neuen Prozess.
View ResizeImageWorkerCommand
, um die Struktur der Arbeiterbefehle zu verstehen. Auf diese Weise implementierte Arbeitsprozesse können auch als Symfony -Konsolenbefehl manuell gestartet werden: ./bin/console app:resize-image-worker
.
Erstellen Sie die Supervisor -Konfiguration
wir möchten, dass unser Arbeiterprozess automatisch startet, sodass wir die autostart=true
-Richtlinie in der Konfiguration festlegen. Da der Arbeitsprozess nach einer Zeitüberschreitung oder einer erfolgreichen Aufgabenverarbeitung neu gestartet werden muss, werden wir auch die autorestart=true
-Richtlinie festlegen.
Der beste Teil der Backend -Verarbeitung ist die einfache Parallelverarbeitung. Wir können die numprocs=5
-Richtlinie festlegen, und der Supervisor generiert fünf Arbeitsprozessinstanzen. Sie warten auf Jobs und verarbeiten sie unabhängig voneinander, sodass wir das System problemlos skalieren können. Wenn sich das System weiterentwickelt, müssen Sie möglicherweise die Anzahl der Prozesse erhöhen. Da wir mehrere Prozesse ausgeführt haben, müssen wir die Struktur des Prozessnamens definieren, sodass wir die process_name=%(program_name)s_%(process_num)02d
-Richtlinie festlegen.
Zu guter Letzt möchten wir die Ausgabe von Arbeitsprozessen speichern, damit sie bei Problemen analysiert und debuggen werden können. Wir werden die Pfade stderr_logfile
und stdout_logfile
definieren.
Die vollständige Supervisor -Konfiguration für unseren Größen -Arbeitsprozess lautet wie folgt:
<code class="language-php"><?php namespace App\Service; use Pheanstalk\Pheanstalk; class JobQueueFactory { private $host = 'localhost'; private $port = '11300'; const QUEUE_IMAGE_RESIZE = 'resize'; public function createQueue(): Pheanstalk { return new Pheanstalk($this->host, $this->port); } }</code>
Nach dem Erstellen (oder Aktualisieren) einer Konfigurationsdatei, die sich im Verzeichnis /etc/supervisor/conf.d/
befindet, müssen Sie den Supervisor sagen, dass er seine Konfiguration erneut lesen und aktualisieren soll, indem Sie den folgenden Befehl ausführen:
<code>$ sudo supervisorctl help default commands (type help <topic>): </topic>===================================== add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop version</code>
Wenn Sie Homestead verbessert verwenden (Sie sollten verwenden!), Können Sie scripts/setup-supervisor.sh
verwenden, um eine Supervisor -Konfiguration für das Projekt zu generieren: sudo ./scripts/setup-supervisor.sh
.
attrote erager
Image Thumbnails werden bei der ersten Anfrage nicht mehr gerendert. Wenn wir das Gerät in der LoadGalleriesData
-Geräteklasse laden, müssen wir das Rendern für jedes Bild explizit anfordern:
<code>[program:resize-worker] process_name=%(program_name)s_%(process_num)02d command=php PATH-TO-YOUR-APP/bin/console app:resize-image-worker autostart=true autorestart=true numprocs=5 stderr_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stderr.log stdout_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stdout.log</code>
Jetzt sollten Sie spüren, wie das Gerät langsamer lädt. Deshalb haben wir es in den Hintergrund verschoben, anstatt den Benutzer zu zwingen, darauf zu warten, dass es fertig ist!
Tipps und Tipps
Der Arbeiterprozess wird im Hintergrund ausgeführt. Selbst wenn Sie eine neue Version der Anwendung bereitstellen, werden vor dem ersten Neustart einen veralteten Arbeitsprozess ausgeführt.
In unserem Fall müssen wir auf alle Arbeiterprozesse warten, um ihre Aufgaben oder Auszeiten (5 Minuten) zu erledigen, bis wir sicher sind, dass alle Arbeitsprozesse aktualisiert wurden. Achten Sie darauf, wenn Sie den Bereitstellungsprozess erstellen!
FAQs bei der Verwendung von Hintergrundverarbeitung, um die Seitenladezeit (FAQ)
zu beschleunigenWelche Rolle spielt die Hintergrundverarbeitung beim Laden von Seite?
Hintergrundverarbeitung spielt eine entscheidende Rolle bei der Verbesserung der Seitenladegeschwindigkeit. Es ermöglicht es, bestimmte Aufgaben im Hintergrund auszuführen, wodurch die Hauptfadenressourcen freigelassen werden und sich auf das Laden von Seite konzentrieren. Dies bedeutet, dass Benutzer nicht warten müssen, bis diese Aufgaben erledigt werden, um die Seite zu laden, was zu einem schnelleren und reibungsloseren Browsing -Erlebnis führt.
Wie hilft Symfony -Prozesskomponenten bei der Hintergrundverarbeitung?
Die Symfony -Prozesskomponente ist ein leistungsstarkes Tool, mit dem Sie Befehle in untergeordneten Prozessen ausführen können. Es bietet eine einfache objektorientierte API für das Ausführen von Systembefehlen und die Verwaltung seiner Ausgabe. Dies ist besonders nützlich für die Hintergrundverarbeitung, da Sie Aufgaben in separaten Prozessen ausführen können, ohne den Hauptfaden zu blockieren.
Was sind einige gemeinsame Anwendungsfälle für die Backend -Verarbeitung?
Hintergrundverarbeitung wird normalerweise in Situationen verwendet, in denen Aufgaben ohne Rücksicht auf den Hauptfaden ausgeführt werden können. Dies beinhaltet Aufgaben wie das Senden von E -Mails, das Verarbeiten von Bildern, das Ausführen komplexer Berechnungen und mehr. Wenn Sie diese Aufgaben im Hintergrund ausführen, können Sie die Leistung Ihrer Anwendung verbessern und eine bessere Benutzererfahrung bieten.
Wie führt ich Hintergrundprozesse in PHP aus?
Die Funktion exec()
kann verwendet werden, um Hintergrundprozesse in PHP auszuführen. Mit dieser Funktion können Sie Befehle in einem untergeordneten Prozess ausführen und den Rest des Skripts weiter ausführen, ohne auf den Befehl zu warten. Hier ist ein einfaches Beispiel:
exec("php background_task.php > /dev/null &");
In diesem Beispiel ist background_task.php
das Skript, das Sie im Hintergrund ausführen möchten.
Was ist die Symfony Messenger -Komponente und was hat es mit der Hintergrundverarbeitung zu tun?
Die Symfony Messenger -Komponente ist ein Nachrichten -Bus -System, mit dem Meldungen asynchron an Handler gesendet werden können. Dies bedeutet, dass Sie Nachrichten an den Bus senden und dann das Skript weiter ausführen können, ohne auf die Verarbeitung der Nachricht zu warten. Dies ist eine Form der Hintergrundverarbeitung, da die Verarbeitung von Nachrichten in einem separaten Prozess durchgeführt werden kann.
So verwenden Sie die Backend -Verarbeitung, um die Leistung Ihrer Website zu verbessern?
Durch Entladen der Aufgabe in den Hintergrund können Sie die Haupt -Thread -Ressource freilegen und sich auf das Laden der Seite konzentrieren. Dies kann die Leistung Ihrer Website erheblich verbessern, insbesondere wenn Sie zeitaufwändige oder ressourcenintensive Aufgaben haben. Einige gängige Aufgaben, die in den Hintergrund abgeladen werden können, umfassen das Senden von E -Mails, das Verarbeiten von Bildern und das Ausführen komplexer Berechnungen.
Was sind die potenziellen Herausforderungen der Backend -Verarbeitung und wie können diese Herausforderungen gemindert werden?
Eine der Hauptherausforderungen der Backend -Verarbeitung besteht darin, sicherzustellen, dass die Aufgaben in der richtigen Reihenfolge erfolgreich und abgeschlossen sind. Dies kann durch die Verwendung einer Task -Warteschlange gemildert werden, die sicherstellt, dass Aufgaben in der Reihenfolge ausgeführt werden, die sie hinzugefügt werden. Eine weitere Herausforderung besteht darin, Fehler bei Hintergrundaufgaben zu behandeln. Dies kann durch die Implementierung robuster Fehlerbehebung und Protokollierungsmechanismen gelöst werden.
Kann die Hintergrundverarbeitung in Kombination mit anderen Leistungsoptimierungstechniken verwendet werden?
Ja, die Hintergrundverarbeitung kann in Verbindung mit anderen Leistungsoptimierungstechniken verwendet werden. Beispielsweise können Sie Caches verwenden, um die Ergebnisse teurer Vorgänge zu speichern und dann die Hintergrundverarbeitung zu verwenden, um den Cache regelmäßig zu aktualisieren. Auf diese Weise können Sie die neuesten Daten bereitstellen, ohne die Anwendung zu verlangsamen.
Wie kann der Fortschritt von Hintergrundaufgaben überwacht werden?
Eine Vielzahl von Tools und Techniken kann verwendet werden, um den Fortschritt von Backend -Aufgaben zu überwachen. Ein allgemeiner Ansatz ist die Verwendung der Protokollierung, um den Status jeder Aufgabe aufzuzeichnen. Sie können auch Tools wie die Messenger-Komponente von Symfony verwenden, die eine integrierte Unterstützung für die Überwachung und Debuggierung von Backend-Aufgaben bietet.
Gibt es bei der Verwendung von Hintergrundverarbeitung Sicherheitsvorkehrungen?
Ja, es gibt einige Sicherheitsvorkehrungen bei der Verwendung der Hintergrundverarbeitung. Sie müssen beispielsweise sicherstellen, dass Hintergrundaufgaben keine sensiblen Informationen austreten und keine Injektionsangriffe unterliegen. Sie sollten auch sicherstellen, dass Ihre Aufgaben in einer sicheren Umgebung ausgeführt werden und dass sie nicht mehr Berechtigungen haben, als sie ihre Arbeit erledigen müssen.
Das obige ist der detaillierte Inhalt vonVerwenden der Hintergrundverarbeitung, um die Seitenladezeiten zu beschleunigen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!