Re: Cannot make use_strict_mode work with custom session handler upon'files'

[email protected] (Ivan Grigoriev)
Newsgroups php.general
Message-ID <[email protected]>
17.03.2017 22:52, Ivan Grigoriev пишет:
> I want to implement custom session handler upon internal files handler
> similar to this:
> http://php.net/manual/en/class.sessionhandler.php#example-5380 (example 1).
>
> But with session.use_strict_mode = 1.
>
> I have been trying to test this sample code, but I can't seem to get it
> to work:
>
> ---
> session_module_name('files');
> ini_set('session.use_strict_mode', '1');
>
> class MySessionHandler extends SessionHandler{}
> session_set_save_handler(new MySessionHandler(), true);
>
> session_start();
> var_dump(session_id());
> ---
>
> After delete an existing session file and rerun script, it create new
> file with the same id.
>
> When there is no session_set_save_handler() it works as expected: new
> file is created with new id.
>
> I suppose that it is a bug, but maybe there is a solution that I can't see.
This is definitely a bug.
I tried to write a bug report but have no success.
https://bugs.php.net/bug.php?id=74255

This is a minimal implementation:
<?php
session_module_name('files');
ini_set('session.use_strict_mode', '1');

session_set_save_handler(new MySessionHandler(), true);

session_start();
var_dump(session_id());

class MySessionHandler extends SessionHandler
{
     /**
      * Getting full path to session file
      *
      * It's depend on internal realization of 'files' hander.
      * Must be reviewed after each php release.
      */
     private function getFullPathName(string $key) : string
     {
         if (empty($filename = session_save_path())) {
             $filename = sys_get_temp_dir();
         } elseif (strpos($filename, ';') !== false) {
             $data = explode(';', $filename);
             $count = $data[0];
             $filename = end($data);
             for ($i = 0; $i < $count; $i++) {
                 $filename .= '/' . $key[$i];
             }
         }
         return $filename.'/sess_'.$key;
     }

     public function validateId($key)
     {
         return file_exists($this->getFullPathName($key));
     }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.