// vérifie que la session n'a pas encore été utilisée
if (session_status() != PHP_SESSION_ACTIVE)
{
class SessionOVH implements SessionHandlerInterface {
private $path; // stockage définie dans session_save_path()
public function open($path, $sessionName): bool
{
// mémorie avec un préfixe
$this->path = $path . '/ses'
;
// créé le dossier si besoin
if (! is_dir($path)) {
@mkdir($path, 0777);
return is_dir($path);
}
return true;
}
private function id_to_filename($id)
{
// protège le numéro de session pour utilisation en nom de fichier
return preg_replace('{\W}'
, '-'
, $id) ? $this->path . $id : false;
}
#[\ReturnTypeWillChange]
public function read($id)
{
$filename = $this->id_to_filename($id);
return $filename ? (string)@file_get_contents($filename) : false;
}
public function write($id, $data): bool
{
$filename = $this->id_to_filename($id);
return $filename ? file_put_contents($filename, $data) !== false : false;
}
public function destroy($id): bool
{
$filename = $this->id_to_filename($id);
if (! $filename || ! file_exists($filename))
return false;
unlink($filename);
return true;
}
#[\ReturnTypeWillChange]
public function gc($maxlifetime)
{
$deadline = time() - $maxlifetime;
foreach (glob($this->path . '*'
) as $file)
if (filemtime($file) < $deadline)
unlink($file);
return true;
}
public function close(): bool
{
return true;
}
}
// modifie le mécanisme de session PHP
session_set_save_handler(new SessionOVH(), true);
// change le chemin
session_save_path(dirname($_SERVER['DOCUMENT_ROOT'
]) . '/sessions'
);
// expire au bout de 20 heures
session_cache_expire(20*60);
// lance le mécanisme de session
session_start();
}