Re: SessionHandlerInterface protocol
| From: | Christoph M. Becker | Date: | Wed, 23 Jun 2021 10:01:32 +0000 |
| Subject: | Re: SessionHandlerInterface protocol | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-327565@lists.php.net to get a copy of this message | ||
On 23.06.2021 at 09:08, Mathieu Dubois wrote:
> Dear list,
>
> I'm trying to understand PHP session handlers and more precisely the
> return value of SessionHandlerInterface::read.
>
> The doc [1] states (emphasis mine):
>
> Returns an encoded string of the read data. *If nothing was read, it
> must return false*. Note this value is returned internally to PHP
> for processing.
>
> However, the example used in the documentation of the SessionHandler
> class [2] and other implementations (for instance Symfony's
> PdoSessionHandler [3]) seem to return an empty string when nothing can
> be read.
>
> If I understand well, the first time you connect to an host, nothing can
> be read. My own test seems to indicate that returning false in this case
> triggers an error while returning an empty string creates a new session.
>
> Can someone clarify this ? How is the value false used ? More generally,
> I haven't found a clear explanation of which method is called at which
> time during session creation and how the values are used.
>
> Note that I have posted the same question on SO [4] but I'm not
> satisfied by the answers.
>
> Thanks in advance,
> Mathieu
>
> [1]
> https://www.php.net/manual/en/sessionhandlerinterface.read.php
> [2] https://www.php.net/manual/en/class.sessionhandler
> [3]
>
> https://github.com/symfony/symfony/blob/c71c8727cc665c9e9b56e299fcfcc0adfbf02bac/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php#L638
>
> [4] https://stackoverflow.com/questions/68025570
Before ::read() is called, open() is called. ::open() is suppossed to
create the empty session data, if no data for the given session exist.
This empty data string should then be returned from ::read(). If
::read() fails to read the data, it should return false (or actually any
non-string value in the current implementation) to signal failure.
Christoph