Si të dërgoni njoftime Push në ueb me PHP
Web Push API ju lejon të dërgoni njoftime shtytëse te shfletuesit dhe API-të e uebit. Ndërsa pjesa më e madhe e logjikës ndodh në shfletues, ju duhet ende një komponent nga ana e serverit për të gjeneruar njoftimet tuaja. Ja se si të implementoni një backend Web Push duke përdorur PHP.
Parakushtet
Për qëllimet e këtij tutoriali, ne do të supozojmë se jeni njohur me bazat e krijimit të API-ve HTTP në PHP. Do t'ju duhet të ekspozoni disa pika përfundimtare publike duke përdorur kornizën tuaj të internetit. Këto do të thirren nga JavaScript në shfletuesin tuaj për të regjistruar dhe çregjistruar pajisjet.
Ky artikull nuk do të prekë kodin e anës së shfletuesit ose mënyrën se si funksionon. Do t'ju duhet të krijoni një punonjës shërbimi që i përgjigjet ngjarjeve të hyrjes dhe i shfaq përdoruesit një njoftim.
Në një nivel të lartë, fluksi i Ueb Push duket si ky:
- Një abonim push është regjistruar në shfletues. Shfletuesi lëshon një URL unike të pikës fundore në JavaScript.
- JavaScript juaj dërgon të dhënat e abonimit në serverin tuaj dhe identifikon përdoruesin për të cilin aplikohet.
- Kur backend-i juaj duhet të dërgojë një njoftim shtytës, krijoni një ngarkesë dhe dërgojeni në URL-në e pikës fundore të raportuar si pjesë e të dhënave të abonimit.
- Shfletuesi i përdoruesit do të marrë ngarkesën përmes platformës së dërgimit të njoftimeve të shitësit. Punonjësi juaj i shërbimit JavaScript trajton ngjarjen pasuese dhe përdor API-në e njoftimit të shfletuesit për të paralajmëruar përdoruesin.
Ja se si të zbatoni aspektet e serverit të hapave 1 deri në 3.
Po merr konfigurimin
Ne do të përdorim paketën web-push
Packagist nga minishlink. Kjo abstrakton ndërveprimet me çdo platformë njoftimi të shfletuesit, kështu që nuk keni nevojë të bëni dallimin manualisht midis llojeve të pikës fundore.
Shtoni paketën në projektin tuaj duke përdorur Composer:
composer require minishlink/web-push
Për të përdorur versionin më të fundit, ju nevojitet PHP 7.2 ose më i ri me gmp
, mbstring
, curl
dhe openssl
zgjerimet. Nëse duhet të përdorni një version më të vjetër PHP, kyçeni paketën në një version të mëparshëm për të ruajtur përputhshmërinë.
Biblioteka ekspozon një klasë thelbësore WebPush
me metoda që ju lejojnë të dërgoni njoftime individualisht ose si grupe. Abonimet përfaqësohen nga shembuj të klasës Abonim
.
Sigurimi i çelësave VAPID
Besimi në ekosistemin Web Push në përputhje me standardet zbatohet nëpërmjet përdorimit të çelësave VAPID. Serveri juaj ka nevojë për një çift çelësash VAPID në mënyrë që të mund të vërtetohet në shfletues. Çelësi publik duhet të ekspozohet nëpërmjet një pike fundore API.
Mund të gjeneroni një grup çelësash VAPID duke përdorur paketën web-push
:
use MinishlinkWebPushVAPID;
$keyset = VAPID::createVapidKeys();
// public key - this needs to be accessible via an API endpoint
echo $keyset["publicKey"];
// private key - never expose this!
echo $keyset["privateKey"];
file_put_contents("vapid.json", json_encode($keyset));
Gjeneroni çelësa për sistemin tuaj dhe ruajini ato në një vend të qëndrueshëm. Shto një pikë fundore API në mënyrë që JavaScript nga ana e klientit të mund të marrë çelësin publik. Kjo do të përdoret për të konfiguruar abonimin push të shfletuesit. Pajisja e përdoruesit do të pranojë ngjarjet hyrëse të shtytjes nëse ato janë nënshkruar duke përdorur çelësin privat përkatës VAPID.
Regjistrimi i abonimeve Push
Hapi tjetër në sekuencë është marrja e kërkesave për abonim push nga klientët tuaj. Pasi shfletuesi të konfirmojë një abonim të ri shtytës, JavaScript juaj duhet të dërgojë URL-në e pikës fundore të abonimit dhe çelësat përkatës të vërtetimit në serverin tuaj. Ruani këto detaje së bashku me ID-në e përdoruesit, në mënyrë që të mund të rikuperoni të gjitha pajisjet e regjistruara me push të lidhura me përdoruesin më vonë.
Ne po heqim mostrat e kodit për këtë hap pasi zbatimi varet nga shtresa juaj e ruajtjes së të dhënave dhe vlerat që dërgon JavaScript juaj. Në mënyrë tipike, kjo do të jetë një paraqitje JSON e një objekti PushSubscription
. Ju duhet një grup i thjeshtë pikash fundore të mbështetura nga baza e të dhënave CRUD API për të krijuar një abonim, për të zëvendësuar një ekzistues dhe për të kërkuar një fshirje kur përdoruesi çabonohet.
Përgatitja e Abonimeve
Pasi një klient të regjistrohet me sukses, mund të filloni të dërgoni njoftime duke përdorur bibliotekën web-push
. Filloni duke krijuar një shembull të klasës WebPush
:
use MinishlinkWebPushWebPush;
$webPush = new WebPush([
"VAPID" => [
"subject" => "https://example.com",
"publicKey" => "VAPID_Public_Key_Here",
"privateKey" => "VAPID_Private_Key_Here"
]
]);
Mund të ripërdorni një shembull WebPush
sa herë që dërgoni një njoftim. Biblioteka duhet të konfigurohet me grupin e çelësave VAPID që keni krijuar më parë. Çelësat duhet të kodohen si Base64, por kjo trajtohet për ju nëse i krijoni me bibliotekë.
subjekti
VAPID përdoret për të identifikuar serverin tuaj dhe detajet e kontaktit të tij. Ju mund të jepni një URL uebsajti ose një lidhje adrese emaili mailto:
.
Më pas ju duhet të rikuperoni abonimin push të cilit do t'i dërgoni. Përdorni sistemin tuaj të aksesit të të dhënave për të kërkuar URL-të e pikës fundore të shtytjes që lidhen me përdoruesin të cilit dëshironi t'i dërgoni. Konvertoni çdo abonim në një shembull Abonim
:
use MinishlinkWebPushSubscription;
// Get user's push data...
// SELECT * FROM push_subscriptions WHERE user_id = 123456
$subscription = Subscription::create([
"endpoint" => "https://fcm.google.com/...",
"contentEncoding" => "aesgcm",
"authToken" => "<auth token from JavaScript PushSubscription object>"
"keys" => [
"auth" => "<auth token from JavaScript PushSubscription object>",
"p256dh" => "<p256dh token from JavaScript PushSubscription object>"
]
]);
Vetia auth
e PushSubscription
përsëritet dy herë për të përballuar dy versione të ndryshme të specifikimeve të përdorura nga shërbimet e shfletuesit. Vetia P256DH është një tjetër çelës publik që duhet të jepet kur vendoset në abonim.
Biblioteka web-push
është e përputhshme me pikat fundore të Chrome dhe Firefox-it. Do të funksionojë gjithashtu me çdo zbatim tjetër të Web Push që plotëson standardin aktual.
Dërgimi i një njoftimi
Tani kombinoni rastet tuaja WebPush
dhe Abonim
për të dërguar një njoftim:
$result = $webPush -> sendOneNotification(
$subscription,
json_encode([
"message" => "Demo notification",
"foo" => "bar"
])
);
Thirrja e sendOneNotification()
siguron dërgim të menjëhershëm për një njoftim të vetëm. Ngarkesa në këtë rast është një grup i koduar me JSON me dy veti. Varet nga ju se çfarë të dhënash dërgoni dhe formati që përdorni – klienti juaj JavaScript i merr ato siç është dhe mund t'i interpretojë sipas nevojës.
Dërgimi i një njoftimi kthen një klasë rezultati që ju lejon të kontrolloni nëse operacioni pati sukses:
if ($result -> isSuccess()) {
// all good
}
else {
// something went wrong
error_log($result -> getReason());
// provides raw HTTP response data
error_log($result -> getResponse());
}
Mund të ndërmerrni veprime për të riprovuar ose anuluar dorëzimin nëse ndodh një gabim.
Abonimet e njoftimeve gjithashtu mund të skadojnë. Thirrni metodën isSubscriptionExpired()
në një klasë rezultati për të përcaktuar nëse kjo është arsyeja e dështimit. Ju mund ta fshini abonimin nga databaza juaj në këtë skenar, duke u siguruar që të mos dërgoni asgjë tjetër në një pikë përfundimtare të vdekur.
Njoftimet e grumbullimit
Njoftimet mund të grumbullohen së bashku për dërgim me një telefonatë të vetme:
$webPush -> queueNotification($subscription, ["msg" => "first"]);
$webPush -> queueNotification($subscription, ["msg" => "second"]);
foreach ($webPush -> flush() as $i => $result) {
echo ("Notification $i was " . ($result -> isSuccess() ? "sent" : "not sent"));
}
Kjo është e dobishme kur e dini se do të dërgoni një numër të madh njoftimesh në një afat të shkurtër kohor. Vendosni në radhë të gjitha ngarkesat tuaja dhe lërini web-push
t'i dorëzojë ato në mënyrën optimale.
Ju mund të kufizoni numrin e njoftimeve të dërguara në një flush()
duke kaluar një numër të plotë në metodë:
$webPush -> flush(100); // send 100 messages
Vlera e paracaktuar është 1000
.
Opsionet e njoftimit
sendOneNotification()
dhe queueNotification()
pranojnë opsionet e mëposhtme si një argument të grupit të tretë:
TTL
– Kontrollon për sa kohë platforma e njoftimit e shfletuesit do të mbajë mbi njoftimin nëse nuk mund të kalohet menjëherë në pajisjen e përdoruesit. Nëse pajisja e përdoruesit është jashtë linje, platformat e paracaktuara do të përpiqen ta dorëzojnë atë për katër javët e ardhshme. Nëse po dërgoni një njoftim që nuk do të jetë i rëndësishëm javën e ardhshme, rregulloni TTL-në në përputhje me rrethanat në mënyrë që përdoruesi të mos shohë përmbajtje të vjetëruar.urgjenca
– Pranonnormale
,i ulët
oseshumë i ulët
si vlera . Disa platforma mund ta përdorin këtë për të rregulluar frekuencën e dërgimit të njoftimeve. Pajisjet që hyjnë në modalitetin e kursimit të baterisë mund të pezullojnë dërgimin e njoftimeve jo urgjente.batchSize
– Ky ka të njëjtin efekt si argumenti përflush()
i përshkruar më sipër.
Ju mund të konfiguroni vlerat e opsioneve të paracaktuara duke përdorur argumentin e dytë për konstruktorin WebPush
:
$webPush = new WebPush(["VAPID" => [...]], ["TTL" => 3600]);
Përmbledhje
Biblioteka web-push
e bën të lehtë dërgimin e njoftimeve të Web Push duke përdorur PHP. Ju merrni një shtresë abstraksioni në krye të platformave të ndryshme të shfletuesit që mbështet grumbullimin, trajtimin e gabimeve dhe të gjitha veçoritë e Web Push.
Mekanizmi Web Push është një sistem i pazakontë i shfletuesit pasi mbështetet në komponentët e largët të serverit që i furnizoni vetë. Kjo mund ta bëjë atë të duket e errët dhe teknike. Në praktikë, krijimi i një backend të thjeshtë PHP është i shpejtë dhe i lehtë; zbatimi i frontendit është zakonisht aspekti që kërkon më shumë kohë, veçanërisht nëse nuk po përdorni tashmë veçoritë e punonjësve të shërbimit.