How to use Redis with Laravel

Foto von Emile Perron auf Unsplash

PHP (Hypertext Preprocessor) ist eine Open-Source-Skriptsprache, die mit integrierten Web Entwicklungsfunktionen entwickelt wurde. Es wird seit über 20 Jahren in der Webentwicklung eingesetzt. Obwohl PHP derzeit für fast 80 % aller Websites eingesetzt wird, weist es einige erhebliche Schwachstellen auf. Eine davon ist das Single-Thread-Verfahren.

PHP verfügt nicht über eine Standardfunktion, um zusätzliche Threads für Hintergrundprozesse zu erzeugen. Aufgrund des Single-Thread-Designs der Sprache werden Sie es schwer haben, auch nur eine einfache Webanwendung zu erstellen, die E-Mails versenden muss. Das Versenden einer E-Mail ist ein teurer und zeitaufwändiger Prozess, der den einzelnen PHP-Thread blockieren kann.

PHP-Frameworks lösen das Problem

Für PHP gibt es eine große Anzahl von Open-Source-Frameworks. Ihr Hauptziel ist es, die Entwicklungszeit für komplexe Webanwendungen durch die Anwendung vordefinierter Konzepte zu verkürzen. Sie helfen PHP-Entwicklern, Aufgaben zu automatisieren, effizient mit verschiedenen Arten von Datenbanken zu arbeiten, Anwendungen gegen bekannte Schwachstellen zu schützen und Tests durchzuführen. Die beliebtesten Frameworks sind Laravel, Zend, Symfony und Phalcon. Jede von ihnen hat ihre eigenen Vorteile und eine große Gemeinschaft, die zur Open-Source-Codebasis beiträgt.

Jedes Framework bietet eine Möglichkeit, das Problem des Multithreading in PHP zu umgehen. Wenn Sie einen Prozess im Hintergrund laufen lassen wollen, ist das allgemeine Konzept das folgende: Die Informationen über eine Aufgabe werden an einen Warteschlangen Treiber/Nachrichten Bus gesendet, während der Server ständig die Liste der Aufgaben überprüft, um zu sehen, ob es etwas auszuführen gibt.

Finden Sie Ihren nächsten Entwickler

Loslegen

Handhabung von Nachrichtenwarteschlangen in Laravel

Laravel verfügt über eine einheitliche Warteschlangen-API, mit der Sie aus verschiedenen Technologien wie Redis, Amazon SQS, Beanstalkd oder sogar einem altmodischen relationalen Datenbanksystem wählen können. Sehen wir uns an, wie Laravel mit Redis, einem Open-Source-Speicher für In-Memory-Datenstrukturen, funktioniert.

Was ist die Verwendung von Redis in Laravel? Im Prinzip schieben Sie eine Aufgabe (oder "dispatching a job", wie es im Laravel-Ökosystem genannt wird) in die Redis-Warteschlange, wo sie wartet, bis sie abgeholt und verarbeitet wird. Um Warteschlangen zu bearbeiten, brauchen Sie Arbeiter, die ununterbrochen arbeiten. Auf Produktions Servern sollten Sie über einen Supervisor verfügen, einen Prozessmonitor, der in Linux-Umgebungen häufig verwendet wird.

Angenommen, Sie haben ein Benutzermodell, von dem für jede neue Registrierung eine Instanz erstellt werden soll. Es gibt keine Standardmethode, um dies zu erreichen: Es ist alles eine Frage der Präferenzen. Zur einfachen Implementierung benötigen Sie einen Beobachter und einen Auftrag in der Warteschlange:

Der Beobachter wird ausgelöst, wenn eine Instanz des Modells erstellt wird. Der Beobachter gibt den Auftrag an die Warteschlange weiter.

Der Datenschutzbeauftragte führt eine Warteschlange: Arbeit für das Projekt. Sobald ein neuer Job versandt wird, wird er von Laravels Queue Worker verarbeitet.

Schauen wir uns ein Codebeispiel an.

Zunächst müssen Sie einen Beobachter für das Benutzermodell und einen Auftrag erstellen:

php artisan make:observer UserObserver --model=User
php artisan make:job SendRegistrationEmail

Als nächstes müssen Sie das, was Sie gerade erstellt haben, in die Anwendung einführen. Sie können dies tun, indem Sie einen Beobachter im EventServiceProvider wie folgt registrieren:

class EventServiceProvider extends ServiceProvider 
{
public function boot()
{
User::observe(UserObserver::class);
        }
}

Ihre Anwendung hat nun die Definition, was zu beobachten ist, und Sie sollten sie so konfigurieren, dass sie diese Aufgabe erfüllt. UserObserver muss reagieren, wenn eine Instanz des Benutzers Modells erstellt wird. Dies können Sie erreichen, indem Sie die Herstellungsmethode des Beobachters für das zugehörige Modell aktualisieren. Lassen Sie uns 10 Sekunden nach der Erstellung der Modellinstanz eine E-Mail senden, um zu sehen, wie es in der Praxis funktioniert.

namespace App\Observers;
class UserObserver
{
public function created(User $user)
{
SendRegistrationEmail::dispatch($user->email)->delay(now()->addSeconds(10));
}
}

Jedes Mal, wenn ein Benutzer erstellt wird, wird der Auftrag SendRegistrationEmail vom Beobachter ausgelöst.

class SendRegistrationEmail implements ShouldQueue
{
    public $email;
    public function __construct($email)
{
$this->email = $email;
}
public function handle()
{
    $email = $this->email;
Mail::send([], [], function ($message) use ($email) 
{ 
$message
->to($email)
->subject('Hello, world!')
->setBody('Welcome to the application!');
});
}
}

So setzen Sie den Fluss um. Jetzt sendet die Anwendung einem neuen Benutzer bei der Registrierung eine E-Mail.

Damit es über Warteschlangen funktioniert, müssen Sie die Konfigurationen aktualisieren, um den Redis-Treiber zu verwenden. Nachdem Sie Redis auf Ihrem Rechner installiert haben, reicht es aus, einmal in .env zu aktualisieren:

QUEUE_CONNECTION=redis

Vergessen Sie danach nicht, Ihre Konfigurationen zu aktualisieren: php artisan config:cache. Um Laravels Queue Worker zu starten, müssen Sie php artisan queue:work ausführen.

Lösung von Problemen mit Laravels Queue Workern

In Produktionsumgebungen müssen Sie die Worker ständig laufen lassen. Der queue:work-Befehl selbst kann aus vielen Gründen fehlschlagen, z. B. wegen Überschreitung der maximalen Zeitüberschreitung. Es ist nicht möglich, den Server manuell zu überprüfen, um sicherzustellen, dass der Warteschlange Arbeiter aktiv ist. Stattdessen werden Sie Supervisor verwenden, einen Prozessmonitor für Linux-Umgebungen.

Nachdem Sie den Supervisor auf dem Server installiert haben, müssen Sie ihm eine Konfigurationsdatei geben, damit er mit den Laravel-Warteschlangen arbeiten kann. Erstellen wir eine laravel-worker.conf-Datei, die den queue:work-Prozess verwaltet.

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/project/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/home/project/logs/worker.log
stopwaitsecs=3600

In dieser Konfiguration sollten Sie den Supervisor anweisen, die Worker automatisch neu zu starten und 4 parallele Prozesse laufen zu lassen. Lassen Sie uns mit den Prozessen beginnen:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

Zusammenfassend lässt sich sagen, dass dies so einfach ist, wie Sie es lesen. Der Datenschutzbeauftragte hält die Arbeiter auf Trab. Sobald die Warteschlange einen Auftrag erhält, wird dieser von den Arbeitern ausgewählt und ausgeführt. Auf diese Weise stellen Sie sicher, dass der Benutzer nicht warten muss, bis PHP die Aufgabe des Versendens einer E-Mail bearbeitet und zur nächsten Seite übergeht, indem Sie diese zeitaufwändige Aufgabe in "parallele" Threads verschieben.

Finden Sie Ihren nächsten Entwickler innerhalb von Tagen, nicht Monaten

In einem kurzen 25-minütigen Gespräch würden wir gerne:

  • Auf Ihren Bedarf bezüglich des Recruitments von Software-Entwicklern eingehen
  • Unseren Prozess vorstellen und somit wie wir Sie mit talentierten und geprüften Kandidaten aus unserem Netzwerk zusammenbringen können
  • Die nächsten Schritte besprechen, um den richtigen Kandidaten zu finden - oft in weniger als einer Woche

Unterhalten wir uns