WordPress för webbapplikationsutveckling sessioner

I denna serie tittar vi på hur det är möjligt att bygga webbapplikationer med WordPress.

Hittills har vi pratat om hur WordPress är en grund (snarare än en ram), dess arkitektur, hur vi behöver begreppsmässigt tänka på det när vi närmar oss det speciellt kommer från andra språk, och sedan började vi prata om de komponenter som utgör en grundläggande webbapplikation.

Som en påminnelse nämnde vi:

  • Användarhantering
  • Behörigheter
  • Sessionshantering
  • E-postfunktionalitet
  • Data serialisering och hämtning
  • URL-routing (ibland kallad URL-omskrivning eller omskrivning av regler eller till och med bara rutter)
  • caching
  • Stöd för anpassade frågor

Och började i det senaste inlägget täckte vi både användarhantering och behörigheter.

I det här inlägget ska vi titta på hur man införlivar sessioner inom en WordPress-baserad applikation; Vi kommer dock att anta att du - eller andra läsare - inte känner till sessioner alls.

Så vi börjar på en hög nivå av sessioner, prata om förhållandet mellan sessioner och WordPress, och sedan börja med att integrera sessioner i ditt WordPress-baserade program.


En introduktion till sessioner

För er som inte känner till sessionsbegreppet är det relativt enkelt att förstå (men det kan vara svårt att genomföra beroende på vilken ram eller grund du använder).

Kort sagt är sessioner ett sätt att behålla tillståndet för en applikation över sidladdningar.

Men här är saken: Det kan implementeras på ett antal sätt. I ett scenario kan du helt enkelt skriva data till databasen på en sida och sedan hämta den på nästa sida.

Det här är inte precis det effektivaste sättet att ställa in en session speciellt om du har många aktiva användare, men det gör tillåter dig att behålla staten.

Då är det inte vad vi pratar om när vi hänvisar till sessioner. Istället pratar vi om att hålla en uppsättning information som är kvar i minnet - bokstavligen, i RAM - hela tiden användaren är aktiv på webbplatsen.

Med risken att bli mer teknisk än jag skulle vilja i den här serien av artiklar, där är sätt på vilka sessioner hanteras lite annorlunda så att du kan lämna en webbplats, komma tillbaka och fortfarande ha din aktiva session underhållen.

Tänk på tjänster som Twitter när du inte behöver logga in varje tid du besöker webbplatsen. Oavsett detaljerna i den där genomförandet ligger utanför ramen för denna serie.

Låt oss istället överväga hur en session skulle se ut från den tid en användare landade på en applikations hemsida, loggade in, inrättade en session och loggade sedan ut.

Laddar en ansökan utan en session

Så här är vad en typisk databas-backad applikation ser ut ur perspektivet av inte upprätthålla eventuell sessioninformation. Istället är allt statiskt tillhandahållet på sidor och / eller det laddas från databasen:


Ett enkelt exempel på en databas-backad webbapplikation.

Ganska lätt att förstå, är det inte?

I grund och botten varje gång en sida laddas - eller varje gång en användare navigerar till en ny sida - hämtar sidan den nödvändiga informationen från databasen och presenterar den sedan för användaren.

Laddar en applikation med en session

Om det ovanstående diagrammet visar hur en databasbaserad webbapplikation ser ut utan någon typ av sessionsmekanism, hur ser det ut när den är gör erbjuda stöd för sessioner?

Innan vi tittar på ett diagram över hur det är, låt oss ange följande parametrar:

  • Programmet behåller ingen session för användare som inte är inloggade
  • Applikationen lagrar viss information i sessionen när användaren har loggat in
  • Sessionen kommer att förstöras när användaren loggar ut

Kort sagt innebär det att en gång användaren är inloggad kommer någon information att visas från statisk information, information i databasen och information som lagras i sessionen.


Ett enkelt exempel på en sessionsaktiverad webbapplikation.

Inget fruktansvärt komplicerat, va?

Kort sagt, information laddas i en session som lagras i minnet och hämtas därifrån när det behövs. Annan information som inte är i session men som är relevant för sidan som visas kommer hämtas från data.

Att tillåta detta är implementerat korrekt, du kan verkligen pressa mycket prestanda ur ett program och göra den övergripande användarupplevelsen lite bättre. Men detaljerna i det är bortom denna artikel.

Den viktigaste ta bort från det här avsnittet är hur sessioner fungerar och vilka fördelar de erbjuder.


Sanningen om WordPress och sessioner

För alla som har arbetat med att bygga webbapplikationer i andra ramar, är du troligt bekant med sessioner och hur de fungerar inom ramen för de givna verktygen som du använde.

I själva verket, om du har gjort något tidigare arbete med PHP, är du troligen bekant med hur sessionerna fungerar också.

Men här är ett intressant faktum (åtminstone, jag tycker det är intressant!):

Kärnan WordPress-programmet använder inte sessioner.

Faktum är att den enda gången det kommer nära att behålla någon typ av tillstånd är genom att använda en cookie som genereras när du loggar in på ansökan.


Hur genomför vi sessioner?

När det gäller att implementera sessioner i WordPress, handlar det mer om att förstå hur man genomför en session i PHP och se till att du gör rätt inredning när det behövs.

Specifikt betyder det att du vet hur man:

  • Starta sessionen
  • Spara information i en session
  • Hämta informationen från sessionen (och hur man hämtar information från databasen om den inte finns i en session)
  • Förstör sessionen

Låter enkelt nog, eller hur? För det mesta är det bara, som med de flesta saker i utveckling, det finns saker som vi måste överväga.

Börja sessionen

Det första du behöver notera är att sessioner måste startas. Detta görs genom att ringa till PHP session_start () fungera.

Det finns två saker att notera om att starta en session i PHP:

  1. Du vill bara starta en session om ett session-ID inte existerar
  2. Du måste starta en session innan någon information skickas till webbläsaren

För att göra detta kan du definiera en funktion med en lämplig krok men den måste vara tillräckligt tidigt i WordPresss livscykel.

I exemplet med den här artikeln ska jag börja en session om En användare är inloggad. Om en användare är inloggad lagrar vi den tid då de loggade in. annars kommer vi inte göra någonting.

Fall i punkt: I koden nedan börjar jag en session under WordPress ' i det verkan.

funktion example_login () if (! session_id () && is_user_logged_in ()) session_start ();  add_action ('init', 'example_login');

Nu med en session startad kan vi faktiskt börja lagra information.

Spara sessioninformation

Att arbeta med sessionsdata liknar mycket att arbeta med data lagrad i $ _GET, $ _POST, eller till och med i en normal associativ grupp. Kort sagt, PHP erbjuder $ _SESSION samling som tillåter oss att lagra information via nyckel / värdepar.

När vi fortsätter med exemplet ovan lagrar vi den aktuella tiden då användaren loggade in. Observera dock att vi måste Kontrollera först om värdet är inställt i samlingen; Annars kommer vi skriva över det varje gång.

funktion example_login () if (! session_id () && is_user_logged_in ()) session_start (); om (! isset ($ _SESSION ['time'])) $ _SESSION ['time'] = tid ();  add_action ('init', 'example_login');

Enkelt nog - först kontrollerar jag för att se om a session_id () är inställd och jag kontrollerar om användaren är inloggad. Om så är fallet, spara tid.

Men nu måste vi faktiskt hämta informationen från sessionen någon annanstans i kodbasen.

Hämta sessioninformation

Precis som vid lagring av information i arrays kan vi hämta informationen på samma sätt, men det finns ett tillvägagångssätt: vi måste se till att värdet är inställt i matrisen och att det inte är tomt.

Vi kan göra detta med en enkel förutsättning:

om (isset ($ _SESSION ['time']) &&! tomt ($ _SESSION ['time'])) print_r ($ _SESSION ['time']); 

Antag att värdet är närvarande i $ _SESSION samling, då borde vi vara bra att gå.

Förstör sessionen

Detta kan göras vid utloggning. Med den angivna koden bör du se skillnad på din webbplats baserat på om du är inloggad eller inte.

Slutligen, eftersom vi etablerar en session när användaren är inloggad vill vi förstöra sessionen när användaren loggar ut. Detta är relativt enkelt med hjälp av PHP session_destroy () fungera; Det finns dock några finare nyanser som måste förstås.

Direkt från PHP-manualen:

session_destroy () förstör all data som är associerad med den aktuella sessionen. Det avstänger inte någon av de globala variablerna som är associerade med sessionen, eller avaktiverar sessionskakan

Kort sagt innebär det att mekanismen för fortlöpande sessionsinformation förstörs, men värdena som hålls i samlingssamlingen hålls fortfarande.

funktion example_logout () if (session_id ()) session_destroy ();  add_action ('wp_logout', 'example_logout');

Men igen, som med andra associativa arrays och samlingar i PHP, kan du återställa dessa värden (eller skriva över dem). Oavsett, det går utöver omfattningen av den här serien.

Det finns några Gotchas!

Vad skulle en artikel om programmering vara utan någon typ av gotchas, rätt?

För det första har vi redan etablerat att själva WordPress-kärnan är statslös. Inte bara det, men det upprätthåller också en funktion som används för att återställa globals (du kan hitta denna funktion i wp-includes / load.php - leta efter wp_unregister_GLOBALS).

När du tittar på källkoden märker du följande rader:

$ input = array_merge ($ _GET, $ _POST, $ _COOKIE, $ _SERVER, $ _ENV, $ _FILES, isset ($ _SESSION) && is_array ($ _SESSION)? $ _SESSION: array ()); foreach ($ input som $ k => $ v) om (! in_array ($ k, $ no_unset) && isset ($ GLOBALS [$ k])) unset ($ GLOBALS [$ k]); 

Detta gäller för att avaktivera värden i sessionen, så, på ett visst sätt, kan WordPress faktiskt försöka avaktivera din session.

För det andra stöder inte alla webbhotell PHP-sessioner eller $ _SESSION samling. För det ändamålet måste du se till att miljön där du använder ditt arbete erbjuder den nödvändiga konfigurationen och supporten för det du släpper ut.

Vad är en utvecklare att göra?

Så om du är orolig för att du måste hantera mycket kod för att säkerställa att sessioner fungerar inom WordPress (och inte sönder) samtidigt som du inte vill hantera de olika värdmiljöerna och deras olika konfigurationer , då rekommenderar jag starkt att kolla Eric Manns arbete på WP_Session.

Det här projektet ligger utanför ramen för det som vi försöker täcka här i den här artikeln. Detta plugin är dock värt att kolla in som det ger en bra session management lag för WordPress utan mycket av det överhuvudtaget som vi har täckt här.


Gör sessioner även materia?

Först minns att sessioner inte är unika för WordPress. De är en funktion av PHP som vi kan implementera inom sammanhang av WordPress. För det ändamålet kan vi introducera några riktigt coola funktionaliteter baserade på användarnas behov.

Men det här ställer frågan: sessioner spelar roll?

Jag tycker att denna fråga är lite subjektiv.

Om du bygger en webbapplikation där varje användare måste gå runt på webbplatsen med information som är unik för sin session - till exempel, deras förnamn, efternamn, sista inloggningsdatum och andra roliga saker - Ja, jag tror att du har ett fall för att använda en session.

Men om du bygger något som kräver inget annat än autentisering innan du lämnar information från en databas, då skulle jag fråga om du behöver implementera en session.

Allt detta att säga: Det beror på vilken typ av projekt du har.

Vid denna tidpunkt är vi redo att gå vidare till nästa gemensamma komponent i webbapplikationer: e-post.

I stället för att förlita sig på PHP och leda det i WordPress-livscykeln, gör WordPress API-arbetet med e-post relativt trivialt och verkligen kraftfullt. Och med det ska vi granska det i nästa artikel.