So senden Sie Web-Push-Benachrichtigungen mit PHP –

Mit der Web Push API können Sie Push-Benachrichtigungen an Webbrowser und APIs senden. Während der größte Teil der Logik im Browser stattfindet, benötigen Sie immer noch eine serverseitige Komponente, um Ihre Benachrichtigungen zu generieren. Hier erfahren Sie, wie Sie ein Web-Push-Backend mit PHP implementieren.

Zusammenfassung

Voraussetzungen

Für die Zwecke dieses Tutorials gehen wir davon aus, dass Sie die Grundlagen zum Erstellen von HTTP-APIs in PHP kennen. Sie müssen einige öffentliche Endpunkte mithilfe Ihrer Webinfrastruktur verfügbar machen. Diese werden durch das JavaScript Ihres Browsers aufgerufen, um Geräte an- und abzumelden.

Dieser Artikel behandelt nicht den browserseitigen Code oder seine Funktionsweise. Sie müssen einen Service Worker einrichten, der auf eingehende Push-Ereignisse reagiert und dem Benutzer eine Benachrichtigung anzeigt.

Auf hoher Ebene sieht der Web-Push-Flow folgendermaßen aus:

  1. Ein Push-Abonnement wird im Browser gespeichert. Der Browser sendet eine eindeutige Endpunkt-URL an Ihr JavaScript.
  2. Ihr JavaScript sendet Abonnementdaten an Ihren Server und identifiziert den Benutzer, für den sie gelten.
  3. Wenn Ihr Backend eine Push-Benachrichtigung senden muss, erstellen Sie eine Nutzlast und senden Sie sie an die Endpunkt-URL, die als Teil der Abonnementdaten gemeldet wird.
  4. Der Browser des Benutzers erhält die Nutzlast über die Benachrichtigungsplattform des Anbieters. Ihr JavaScript-Servicemitarbeiter behandelt das resultierende Ereignis und verwendet die Browserbenachrichtigungs-API, um den Benutzer zu warnen.

Hier erfahren Sie, wie Sie die serverseitigen Aspekte der Schritte 1 bis 3 implementieren.

Get configuration

Wir werden das Paket web-push Packagiste von minishlink verwenden. Dadurch werden Interaktionen mit den einzelnen Browserbenachrichtigungsplattformen ignoriert, sodass Sie Endpunkttypen nicht manuell unterscheiden müssen.

Fügen Sie das Paket mit Composer zu Ihrem Projekt hinzu:

composer require minishlink / web-push

Um die neueste Version zu verwenden, benötigen Sie PHP 7.2 oder höher mit dem gmp, mbstring, curl, und openssl Erweiterungen. Wenn Sie eine ältere PHP-Version verwenden müssen, sperren Sie das Paket auf eine ältere Version, um die Kompatibilität zu gewährleisten.

Die Bibliothek stellt eine Kernel WebPush -Klasse mit Methoden bereit, mit denen Sie Benachrichtigungen einzeln oder in Stapeln senden können. Die Subskriptionen werden durch Instanzen des Typs Subscription dargestellt.

Bereitstellung von VAPID Keys

Das Vertrauen in das standardkonforme Web-Push-Ökosystem wird durch die Verwendung von VAPID Keys gestärkt. Ihr Server benötigt ein VAPID-Schlüsselpaar, um sich bei Browsern authentifizieren zu können. Der öffentliche Schlüssel muss über einen API-Endpunkt verfügbar gemacht werden.

Sie können einen VAPID-Schlüsselring mit dem web-push Wrap generieren:

use MinishlinkWebPushVAPID; $ keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointthrew out $ keyset; // private key - never expose this!threw out $ keyset; File_put_contents("vapid.json", json_encode($ keyset));

Generieren Sie Schlüssel für Ihr System und speichern Sie sie an einem dauerhaften Speicherort. Fügen Sie einen API-Endpunkt hinzu, damit Ihr clientseitiges JavaScript den öffentlichen Schlüssel abrufen kann. Dies wird verwendet, um das Browser-Push-Abonnement zu konfigurieren. Das Gerät des Benutzers akzeptiert eingehende Push-Ereignisse, wenn sie mit dem entsprechenden privaten VAPID-Schlüssel signiert wurden.

Registrierung von Push-Abonnements

Der nächste Schritt in der Sequenz besteht darin, Push-Abonnementanfragen von Ihren Kunden zu erhalten. Nachdem der Browser ein neues Push-Abonnement bestätigt hat, sollte Ihr JavaScript die URL des Abonnementendpunkts und die zugehörigen Authentifizierungsschlüssel an Ihren Server senden. Speichern Sie diese Details mit der Benutzer-ID, damit Sie später alle Push-registrierten Geräte abrufen können, die mit dem Benutzer verknüpft sind.

Wir lassen die Codebeispiele für diesen Schritt weg, da die Implementierung von Ihrer Datenspeicherschicht und den von Ihrem JavaScript gesendeten Werten abhängt. Normalerweise ist dies eine JSON-Darstellung eines PushSubscription -Objekts. Sie benötigen einen einfachen Satz datenbankbasierter CRUD-API-Endpunkte, um ein Abonnement zu erstellen, ein vorhandenes Abonnement zu ersetzen und das Löschen anzufordern, wenn sich der Benutzer abmeldet.

Vorbereitung von Abonnements

Sobald ein Kunde erfolgreich registriert wurde, können Sie mit dem Senden von Benachrichtigungen über die web-push -Bibliothek beginnen. Erstellen Sie zunächst eine Instanz des zu klassifizierenden WebPush:

use MinishlinkWebPushWebPush; $ webPush = new WebPush(]);

Sie können jedes Mal, wenn Sie eine Benachrichtigung senden, eine WebPush -Instanz wiederverwenden. Die Bibliothek muss mit dem zuvor generierten VAPID-Schlüsselring konfiguriert werden. Die Schlüssel müssen Base64-codiert sein, dies wird jedoch für Sie erledigt, wenn Sie sie mit der Bibliothek erstellen.

VAPID subject wird verwendet, um Ihren Server und seine Kontaktdaten zu identifizieren. Sie können eine Website-URL oder einen mailto: E-Mail-Adresslink angeben.

Dann müssen Sie das Push-Abonnement abrufen, an das Sie senden möchten. Verwenden Sie Ihr Datenzugriffssystem, um die Push-Endpunkt-URLs zu finden, die dem Benutzer zugeordnet sind, an den Sie senden möchten. Konvertieren Sie jedes Abonnement in ein Subscription -Beispiel:

use MinishlinkWebPushSubscription; // Get user's push data ...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $ subscription = Subscription::create(]);

Die auth -Eigenschaft von PushSubscription wird zweimal wiederholt, um zwei verschiedene Versionen der Spezifikation zu behandeln, die von Browserdiensten verwendet werden. Die Eigenschaft P256DH ist ein weiterer öffentlicher Schlüssel, der beim Festlegen für das Abonnement bereitgestellt werden muss.

Die web-push Die Bibliothek ist kompatibel mit Chrome und Firefox Push-Endpunkte. Es funktioniert auch mit jeder anderen Web-Push-Implementierung, die dem aktuellen Standard entspricht.

Senden einer Benachrichtigung

Kombinieren Sie nun Ihre WebPush und Subscription Instanzen, um eine Benachrichtigung zu senden:

$ result = $ webPush -> sendOneNotification( $ subscription, json_encode());

Appel sendOneNotification() bietet sofortige Lieferung für eine einzige Benachrichtigung. Die Nutzlast ist in diesem Fall ein JSON-codiertes Array mit zwei Eigenschaften. Es liegt an Ihnen, welche Daten Sie senden und welches Format Sie verwenden – Ihr JavaScript-Client empfängt sie unverändert und kann sie nach Bedarf interpretieren.

Das Senden einer Benachrichtigung gibt eine Ergebnisklasse zurück, mit der Sie überprüfen können, ob der Vorgang erfolgreich war:

if ($ result -> isSuccess()) { // all good}else { // something went wrong error_log($ result -> getReason()); // provides raw HTTP response data error_log($ result -> getResponse()); }

Sie können Schritte unternehmen, um die Zustellung zu wiederholen oder zu stornieren, wenn ein Fehler auftritt.

Abonnements für Benachrichtigungen können ebenfalls ablaufen. Rufen Sie isSubscriptionExpired() für eine Ergebnisklasse auf, um festzustellen, ob dies der Grund für den Fehler ist. Sie können das Abonnement in diesem Szenario aus Ihrer Datenbank entfernen und sicherstellen, dass nichts anderes an einen toten Endpunkt gesendet wird.

Stapelbenachrichtigungen

Benachrichtigungen können gruppiert werden, um mit einem einzigen Methodenaufruf zugestellt zu werden:

$ webPush -> queueNotification($ subscription, );$ webPush -> queueNotification($ subscription, ); foreach ($ webPush -> flush() as $i => $ result) { threw out ("Notification $i was " . ($ result -> isSuccess() ? "feels" : "not sent"));}

Dies ist nützlich, wenn Sie wissen, dass Sie in kurzer Zeit eine große Anzahl von Benachrichtigungen senden werden. Stellen Sie alle Ihre Nutzlasten in die Warteschlange und lassen Sie web-push sie optimal liefern.

Sie können die Anzahl der in einem flush()gesendeten Benachrichtigungen begrenzen, indem Sie eine Ganzzahl an die Methode übergeben:

$ webPush -> flush(100); // send 100 messages

Der Standardwert ist 1000.

Benachrichtigungsoptionen

sendOneNotification() et queueNotification() Akzeptieren Sie die folgenden Optionen als drittes Argument des Arrays:

  • TTL – Steuert, wie lange die Browserbenachrichtigungsplattform die Benachrichtigung speichert, wenn sie nicht sofort an das Gerät des Benutzers gesendet werden kann. Wenn das Gerät des Benutzers offline ist, versuchen die Plattformen standardmäßig, es für die nächsten vier Wochen bereitzustellen. Wenn Sie eine Benachrichtigung senden, die nächste Woche nicht relevant ist, passen Sie das Alter entsprechend an, damit der Benutzer keine veralteten Inhalte sieht.
  • urgency – Akzeptieren Sie normal, low ou very-low als Werte. Einige Plattformen können es verwenden, um die Häufigkeit der Benachrichtigungszustellung anzupassen. Geräte, die in den Batteriesparmodus wechseln, können die Zustellung nicht dringender Benachrichtigungen aussetzen.
  • batchSize – Dies hat den gleichen Effekt wie das oben beschriebene Argument von flush() .

Sie können die Standardoptionswerte mit dem zweiten Argument des WebPush -Herstellers konfigurieren:

$ webPush = new WebPush(], );

Zusammenfassung

Die web-push Die Bibliothek macht es einfach, Web-Push-Benachrichtigungen mit PHP zu senden. Sie erhalten eine Abstraktionsebene über den verschiedenen Browserplattformen, die Stapelverarbeitung, Fehlerbehandlung und alle Web-Push-Funktionen unterstützt.

Der Web-Push-Mechanismus ist ein ungewöhnliches Browsersystem, da er auf Remote-serverseitige Komponenten angewiesen ist, die Sie selbst bereitstellen. Dies kann es undurchsichtig und technisch erscheinen lassen. In der Praxis ist das Erstellen eines einfachen PHP-Backends schnell und einfach; Die Front-End-Implementierung ist normalerweise der zeitaufwändigste Aspekt, insbesondere wenn Sie noch keine Service Worker-Funktionen verwenden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.