Поведение обработчика пользовательских сеансов PHP

У меня проблемы с тем, чтобы мой пользовательский обработчик сеансов работал между различными запросами страниц. При первоначальном создании сеанса обработчик работает должным образом, однако при переходе на другую страницу файл cookie сеанса и идентификатор сеанса остаются неизменными, но данные сеанса удаляются.

Например,

class NativeSessionHandler implements \SessionHandlerInterface
{
protected $rootDir = '/tmp';
protected $savePath;

public function open($savePath, $name)
{
$this->savePath = $this->rootDir . '/' . $savePath;
if (! is_dir($this->savePath)) {
mkdir($this->savePath);
}

return true;
}

public function close()
{
return true;
}

public function read($sessionId)
{
$file = $this->savePath . $sessionId;
if (file_exists($file)) {
file_get_contents($file);
}

return true;
}

public function write($sessionId, $data)
{
$file = $this->savePath . $sessionId;
return file_put_contents($file, $data);
}

public function destroy($sessionId)
{
$file = $this->savePath . $sessionId;
if (file_exists($file)) {
unlink($file);
}

return true;
}

public function gc($maxlifetime)
{
foreach (glob($this->savePath) as $file) {
if (file_exists($file) && filemtime($file) + $maxlifetime < time()) {
unlink($file);
}
}

return true;
}
}

// index.php
$handler = new NativeSessionHandler();
session_set_save_handler($handler);

session_start();
$_SESSION['foo'] = 'bar';
echo session_id();
var_dump($_SESSION); // 'foo' => 'bar'

// page.php
$handler = new NativeSessionHandler();
session_set_save_handler($handler);
session_start();
echo session_id(); // same session ID as on index.php
var_dump($_SESSION); // returns null

Любая помощь в выяснении, как заставить это работать должным образом, будет оценена!

0

Решение

Видимо write или же read методы вашего обработчика сеанса не работают. Попробуйте это исправить. Вы можете установить переменную в $ _SESSION и использовать ее на той же странице, потому что PHP использует ваш обработчик сеанса в конце скрипта.

1

Другие решения

Был в состоянии понять это. Вы были правы, что функции чтения / записи были нарушены. Мне нужно было сериализовать и десериализовать данные при чтении и записи. Спасибо за вашу помощь.

public function read($sessionId)
{
$file = $this->savePath . $sessionId;
if (file_exists($file)) {
$data = file_get_contents($file);
return unserialize($data);
}
}

public function write($sessionId, $data)
{
$file = $this->savePath . $sessionId;
return file_put_contents($file, serialize($data));
}
0

По вопросам рекламы [email protected]