So senden Sie Web-Push-Benachrichtigungen mit PHP

PHP Logo

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 abläuft, benötigen Sie dennoch eine serverseitige Komponente, um Ihre Benachrichtigungen zu generieren. So implementieren Sie ein Web-Push-Backend mit PHP.

Voraussetzungen

Für die Zwecke dieses Tutorials gehen wir davon aus, dass Sie mit den Grundlagen der Erstellung von HTTP-APIs in PHP vertraut sind. Sie müssen einige öffentliche Endpunkte mithilfe Ihres Webframeworks verfügbar machen. Diese werden von Ihrem Browser-JavaScript aufgerufen, um Geräte zu registrieren und die Registrierung aufzuheben.

Dieser Artikel behandelt nicht den browserseitigen Code oder seine Funktionsweise. Sie müssen einen Servicemitarbeiter zusammenstellen, 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 registriert. Der Browser gibt eine eindeutige Endpunkt-URL an Ihr JavaScript aus.
  2. Ihr JavaScript sendet die Abonnementdaten an Ihren Server und identifiziert den Benutzer, für den es gilt.
  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 wurde.
  4. Der Browser des Benutzers erhält die Nutzlast über die Benachrichtigungsplattform des Anbieters. Ihr JavaScript-Servicemitarbeiter behandelt das nachfolgende Ereignis und verwendet die Benachrichtigungs-API des Browsers, um den Benutzer zu warnen.

So implementieren Sie die serverseitigen Aspekte der Schritte 1 bis 3.

Einrichten

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

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

composer require minishlink/web-push
Advertisement

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

Die Bibliothek stellt eine core WebPush -Klasse mit Methoden bereit, mit denen Sie Benachrichtigungen einzeln oder als Stapel senden können. Abonnements werden durch Instanzen der Klasse Subscription dargestellt.

Bereitstellung von VAPID Keys

Das Vertrauen in das standardkonforme Web-Push-Ökosystem wird durch die Verwendung von VAPID Keys erzwungen. Ihr Server benötigt ein VAPID-Schlüsselpaar, damit er sich bei Browsern authentifizieren kann. Der öffentliche Schlüssel sollte über einen API-Endpunkt verfügbar gemacht werden.

Mit dem Paket web-pushkönnen Sie einen VAPID-Schlüsselsatz generieren:

use Minishlink\WebPush\VAPID; $keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointecho $keyset; // private key - never expose this!echo $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 Push-Abonnement des Browsers einzurichten. Das Gerät des Benutzers akzeptiert eingehende Push-Ereignisse, wenn sie mit dem entsprechenden privaten VAPID-Schlüssel signiert wurden.

Registrieren von Push-Abonnements

Der nächste Schritt in der Sequenz ist das Empfangen von Push-Abonnementanforderungen von Ihren Clients. Sobald der Browser ein neues Push-Abonnement bestätigt hat, sollte Ihr JavaScript die Endpunkt-URL des Abonnements und die zugehörigen Authentifizierungsschlüssel an Ihren Server senden. Speichern Sie diese Details neben der Benutzer-ID, damit Sie später alle Push-registrierten Geräte abrufen können, die mit dem Benutzer verknüpft sind.

Werbung

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

Abonnements vorbereiten

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

use Minishlink\WebPush\WebPush; $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üsselsatz konfiguriert werden. Schlüssel sollten als Base64 codiert sein, dies wird jedoch für Sie erledigt, wenn Sie sie mit der Bibliothek erstellen.

Der 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.

Als nächstes müssen Sie das Push-Abonnement abrufen, an das Sie senden möchten. Verwenden Sie Ihr Datenzugriffssystem, um die Push-Endpunkt-URLs zu suchen, die dem Benutzer zugeordnet sind, an den Sie senden möchten. Konvertieren Sie jedes Abonnement in eine Subscription -Instanz:

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

Die auth -Eigenschaft von PushSubscription wird zweimal wiederholt, um mit zwei verschiedenen Versionen der von Browserdiensten verwendeten Spezifikation fertig zu werden. Die Eigenschaft P256DH ist ein weiterer öffentlicher Schlüssel, der beim Festlegen in der Subskription angegeben werden sollte.

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

Senden einer Benachrichtigung

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

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

Das Anrufen von sendOneNotification() bietet eine sofortige Zustellung für eine einzelne 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 bei 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 Maßnahmen ergreifen, um die Lieferung zu wiederholen oder abzubrechen, wenn ein Fehler auftritt.

Werbung

Benachrichtigungsabonnements können ebenfalls ablaufen. Rufen Sie die Methode isSubscriptionExpired() für eine Ergebnisklasse auf, um festzustellen, ob dies der Grund für den Fehler ist. In diesem Szenario können Sie das Abonnement aus Ihrer Datenbank löschen, um sicherzustellen, dass Sie nichts anderes an einen toten Endpunkt senden.

Batching-Benachrichtigungen

Benachrichtigungen können mit einem Methodenaufruf zur Auslieferung zusammengefasst werden:

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

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

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

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

Der Standardwert ist 1000.

Benachrichtigungsoptionen

sendOneNotification() und queueNotification() akzeptieren Sie die folgenden Optionen als drittes Array-Argument:

  • TTL – Steuert, wie lange die Benachrichtigungsplattform des Browsers die Benachrichtigung speichert, wenn sie nicht sofort an das Gerät des Benutzers weitergeleitet werden kann. Wenn das Gerät des Benutzers offline ist, versuchen 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 die TTL entsprechend an, damit der Benutzer keine veralteten Inhalte sieht.
  • urgency – Akzeptiert normal, low oder very-low als Werte. Einige Plattformen können dies verwenden, um die Häufigkeit der Benachrichtigungszustellung anzupassen. Geräte, die in einen Batteriesparmodus wechseln, können die Zustellung nicht dringender Benachrichtigungen aussetzen.
  • batchSize – Dies hat den gleichen Effekt wie das oben beschriebene Argument zu flush() .

Sie können Standardoptionswerte mit dem zweiten Argument für den Konstruktor WebPush konfigurieren:

$webPush = new WebPush(], );

Zusammenfassung

Die web-push -Bibliothek erleichtert das Senden von Web-Push-Benachrichtigungen mit PHP. Sie erhalten eine Abstraktionsschicht auf den verschiedenen Browserplattformen, die Batching, Fehlerbehandlung und alle Web-Push-Funktionen unterstützt.

Werbung

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 Frontend-Implementierung ist normalerweise der zeitaufwändigere Aspekt, insbesondere wenn Sie nicht bereits Service Worker-Funktionen verwenden.

Leave a Reply