У меня проблемы с тем, чтобы мой пользовательский обработчик сеансов работал между различными запросами страниц. При первоначальном создании сеанса обработчик работает должным образом, однако при переходе на другую страницу файл 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
Любая помощь в выяснении, как заставить это работать должным образом, будет оценена!
Видимо write
или же read
методы вашего обработчика сеанса не работают. Попробуйте это исправить. Вы можете установить переменную в $ _SESSION и использовать ее на той же странице, потому что PHP использует ваш обработчик сеанса в конце скрипта.
Был в состоянии понять это. Вы были правы, что функции чтения / записи были нарушены. Мне нужно было сериализовать и десериализовать данные при чтении и записи. Спасибо за вашу помощь.
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));
}