Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
CacheSessionHandler
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 8
132
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 create_sid
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
 open
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 close
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 read
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 write
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 destroy
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 gc
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   phpOMS\DataStorage\Session
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15namespace phpOMS\DataStorage\Session;
16
17use phpOMS\DataStorage\Cache\CacheStatus;
18use phpOMS\DataStorage\Cache\Connection\ConnectionAbstract;
19
20/**
21 * Cache session handler.
22 *
23 * @package phpOMS\DataStorage\Session
24 * @license OMS License 2.0
25 * @link    https://jingga.app
26 * @since   1.0.0
27 *
28 * @SuppressWarnings(PHPMD.Superglobals)
29 */
30final class CacheSessionHandler implements \SessionHandlerInterface, \SessionIdInterface
31{
32    /**
33     * Cache connection
34     *
35     * @var ConnectionAbstract
36     * @since 1.0.0
37     */
38    private ConnectionAbstract $con;
39
40    /**
41     * Expiration time
42     *
43     * @var int
44     * @since 1.0.0
45     */
46    private int $expire = 3600;
47
48    /**
49     * Constructor
50     *
51     * @param ConnectionAbstract $con ConnectionAbstract
52     *
53     * @since 1.0.0
54     */
55    public function __construct(ConnectionAbstract $con, int $expire = 3600)
56    {
57        $this->con    = $con;
58        $this->expire = $expire;
59    }
60
61    /**
62     * Create a session id string
63     *
64     * @return string
65     *
66     * @since 1.0.0
67     */
68    public function create_sid() : string
69    {
70        return ($sid = \session_create_id('s-')) === false ? '' : $sid;
71    }
72
73    /**
74     * Open the session storage
75     *
76     * @param string $savePath    Path of the session data
77     * @param string $sessionName Name of the session
78     *
79     * @return bool
80     *
81     * @since 1.0.0
82     */
83    public function open(string $savePath, string $sessionName) : bool
84    {
85        if ($this->con->getStatus() !== CacheStatus::OK) {
86            $this->con->connect();
87        }
88
89        return $this->con->getStatus() === CacheStatus::OK;
90    }
91
92    /**
93     * Closing the cache connection doesn't happen in here and must be implemented in the application
94     *
95     * @return bool
96     *
97     * @since 1.0.0
98     */
99    public function close() : bool
100    {
101        return true;
102    }
103
104    /**
105     * Read the session data (also prolongs the expire)
106     *
107     * @param string $id Session id
108     *
109     * @return false|string
110     *
111     * @since 1.0.0
112     */
113    public function read(string $id) : string|false
114    {
115        $data = $this->con->get($id);
116
117        if ($data === null) {
118            return false;
119        }
120
121        $this->con->updateExpire($this->expire);
122
123        return (string) $data;
124    }
125
126    /**
127     * Write session data
128     *
129     * @param string $id   Session id
130     * @param string $data Session data
131     *
132     * @return bool
133     *
134     * @since 1.0.0
135     */
136    public function write(string $id, string $data) : bool
137    {
138        $this->con->set($id, $data, -1);
139
140        return true;
141    }
142
143    /**
144     * Destroy the session
145     *
146     * @param string $id Session id
147     *
148     * @return bool
149     *
150     * @since 1.0.0
151     */
152    public function destroy(string $id) : bool
153    {
154        $this->con->delete($id);
155
156        return true;
157    }
158
159    /**
160     * Garbage collect session data
161     *
162     * @param int $maxlifetime Maximum session data life time
163     *
164     * @return int|false
165     *
166     * @since 1.0.0
167     */
168    public function gc(int $maxlifetime) : int|false
169    {
170        return (int) $this->con->flush($maxlifetime);
171    }
172}