Heim >Backend-Entwicklung >PHP-Tutorial >Verwenden der Hintergrundverarbeitung, um die Seitenladezeiten zu beschleunigen

Verwenden der Hintergrundverarbeitung, um die Seitenladezeiten zu beschleunigen

Jennifer Aniston
Jennifer AnistonOriginal
2025-02-08 09:26:11324Durchsuche

Using Background Processing to Speed Up Page Load Times

Kernpunkte

  • Hintergrundverarbeitung verbessert die Seitenladegeschwindigkeit erheblich: Übertragen Sie schwere Aufgaben in die Hintergrundverarbeitung, freisetzt die Hauptfadenressourcen und konzentrieren sich auf das Laden von Seite, wodurch das Browsing -Erlebnis des Benutzer verbessert wird.
  • Die beiden Kernkomponenten der Hintergrundverarbeitung: Task -Warteschlange und Arbeitsprozess. Die Anwendung erstellt anstehende Aufgaben, während die Arbeiter die Aufgaben einzeln aus der Warteschlange zur Verarbeitung extrahieren. Mehrere Arbeitsprozesse können parallel verarbeitet werden, um zu beschleunigen.
  • Auswahl der technischen Stapel: Verwenden Sie Beantalkd -Task -Warteschlange, um Aufgaben zu speichern, Symfony -Konsolenkomponente zu implementieren, um Arbeitsprozesse (als Konsolenbefehle) zu implementieren, und der Vorgesetzte verwaltet die Arbeitsprozesse.
  • Bildbibliothekoptimierung: Bildskalierung von Bild auf der ersten Anfrage vermeiden (was die anfängliche Lastbelastung erhöht), aber stattdessen asynchron rendern, nachdem die Galerie erstellt wurde. Diese Aufgabe kann in den Hintergrund verschoben werden, um die Benutzererfahrung und Skalierbarkeit zu verbessern.
  • mögliche Herausforderungen und Antworten: Stellen Sie sicher, dass die Aufgaben in der richtigen Reihenfolge erfolgreich erledigt werden und dass Fehler in den Hintergrundaufgaben ordnungsgemäß behandelt werden. Dies kann durch Verwendung von Task -Warteschlangen und robusten Fehlerbehandlungs- und Protokollierungsmechanismen gemildert werden.

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.

Using Background Processing to Speed Up Page Load Times

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öße

Sobald 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:

  • Aktualisieren Sie die Image -Service -Logik in ImageController
  • Implementieren Sie den verwerteten Worker -Prozess als Konsolenbefehl
  • Supervisor -Konfiguration für unseren Arbeiterprozess
  • erstellen

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

Wir erstellen ein einfaches Ereignis namens
<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

Ereignisabonnenten, die auf
<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: Using Background Processing to Speed Up Page Load Times

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()

Der Arbeiterprozess ist ein einfacher Prozess, der den gleichen Job für jeden Job aus der Warteschlange ausführt. Die Ausführung des Arbeiterprozesses wird am

-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 beschleunigen

Welche 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn