I det meste av min PHP-karriere lagret jeg ikke objekter i en økt. Ikke at det er en vanskelig ting, jeg hadde rett og slett ikke behov for det tidligere. Nå som jeg gjør det, har jeg oppdaget et særegent (etter min mening) aspekt ved det.
Dette skjedde fordi øktdataene på et bestemt område av det aktuelle nettstedet noen ganger ble for stort for databasefeltet jeg lagret det i. PHP serialiserer objektene (for å representere dem som en streng) før de lagres i økten, men når den ikke er i stand til å lagre hele strengen (noe som skjedde for meg), ender du opp med korrupte data som PHP ikke kan avserialisere tilbake til objektform. Så snart jeg forsto at dette var kilden til problemene mine, trengte jeg en god løsning.
Heldigvis trengte jeg ikke å lagre hver eneste bit av objektet siden disse objektene hadde en rekke beskyttede egenskaper jeg ikke trengte for å vedvare i øktene mine. Så løsningen var enkel, implementer Serialiserbart grensesnitt PHP-rekvisita. Med dette grensesnittet kan du definere resultatet av anropet serialize() (og unserialize()) på en gjenstand. Dette er akkurat det jeg ønsket; Jeg kunne nå velge bare de dataene jeg ønsket å lagre og kunne redusere størrelsen på øktdataene mine betraktelig.
Men det gikk ikke! Det var et mysterium. Jeg testet det ved å serialisere en forekomst av et av disse objektene, og jeg ville få det forventede resultatet. Da jeg testet det på nettstedet, ble økten min fylt opp med serialiserte versjoner som inneholdt hele settet med egenskaper som før. Jeg prøvde til og med å bruke de magiske metodene __sleep() og __wakeup(), men ingenting fungerte. Hvorfor? Hvorfor???
Til slutt fant jeg ut hemmeligheten. Jeg husker ikke nå hvor jeg leste det eller hvordan jeg kom over det, men nå deler jeg den hemmeligheten med deg. Når PHP serialiserer objekter for økter, gjør det det på en litt annen måte. Dette betyr at det ikke bryr seg om du har implementert Serializable, eller definert __sleep() i klassene dine. Hvis du gir PHP et objekt å sette i en sesjon, serialiserer det det, men med en “litt annerledes” metode.
!!
Hvorfor? Jeg vet ikke. Det kan være en veldig gyldig grunn til at det må være slik, og det er greit. Kanskje dette var allmennkunnskap på et tidspunkt, men for meg var det litt frustrerende. Men leksjonen ble lært:
Serialiser objektene dine før du lagrer dem i økten
Det er løsningen. Ikke gi økten et objekt, gi den en serialisert versjon av objektet og alt vil bli bra.
Kom i gang med en Magento 2-hostingløsning som gir deg friheten til å lage.