Sessões e objetos PHP

Durante a maior parte da minha carreira em PHP, não armazenei objetos em uma sessão. Não que seja uma coisa difícil, eu simplesmente não precisava disso no passado. Agora que o faço, descobri um aspecto peculiar (na minha opinião) disso.
Isso aconteceu porque os dados da sessão em uma determinada área do site em questão às vezes ficavam muito grandes para o campo do banco de dados em que eu os estava armazenando. O PHP serializa os objetos (para representá-los como uma string) antes de armazená-los na sessão, mas quando não é capaz de armazenar a string inteira (o que estava acontecendo comigo), você acaba com dados corrompidos que o PHP não pode desserializar de volta para a forma de objeto. Depois que descobri que essa era a origem dos meus problemas, precisei de uma boa solução.
Felizmente, não precisei armazenar cada parte do objeto, pois esses objetos tinham várias propriedades protegidas que não precisavam persistir em minhas sessões. Então a solução foi simples, implementar o Interface serializável Suprimentos PHP. Com esta interface você pode definir o resultado da chamada serializar() (e desserializar()) em um objeto. Isso é exatamente o que eu queria; Agora eu poderia escolher apenas os dados que desejava armazenar e reduzir bastante o tamanho dos dados da minha sessão.
Mas não funcionou! Foi um mistério. Eu testei serializando uma instância de um desses objetos e obtive o resultado esperado. Quando testei no site, minha sessão foi preenchida com versões serializadas contendo todo o conjunto de propriedades como antes. Até tentei usar os métodos mágicos __sleep() e __wakeup() mas nada funcionou. Por que? Por que???
Eventualmente, descobri o segredo. Não me lembro agora onde o li ou como o descobri, mas agora compartilho esse segredo com você. Quando o PHP serializa objetos para sessões, ele faz isso de uma maneira um pouco diferente. Isso significa que não importa se você implementou Serializable ou definiu __sleep() em suas classes. Se você der ao PHP um objeto para colocar em uma sessão, ele o serializará, mas usando um método “ligeiramente diferente”.
!!
Por que? Não sei. Pode haver uma razão muito válida para que seja assim, e tudo bem. Talvez isso fosse de conhecimento comum em algum momento, mas para mim foi um pouco frustrante. Mas a lição foi aprendida:

Ler:  Um guia para soluções de gerenciamento de estoque multicanal

Serialize seus objetos antes de armazená-los na sessão

Essa é a solução. Não dê um objeto à sessão, dê a ela uma versão serializada do objeto e tudo ficará bem.

Comece com uma solução de hospedagem Magento 2 que lhe dá liberdade para criar.

Novas publicações:

Recomendação