Sobes.tech
Middle

How to prevent sessions from being saved in files?

sobes.tech AI

Answer from AI

Use a custom session handler implementing the SessionHandlerInterface.

  1. Create a class that implements the methods: open, close, read, write, destroy, gc, and create_sid.
  2. Inside these methods, implement logic to save and read session data using another database (e.g., MySQL, PostgreSQL, Redis, Memcached) or another storage mechanism.
  3. Register this handler using the session_set_save_handler() function.

Example class for saving in Redis:

<?php

class RedisSessionHandler implements SessionHandlerInterface
{
    private $redis;
    private $ttl;

    public function __construct(Redis $redis, int $ttl = 1800)
    {
        $this->redis = $redis;
        $this->ttl = $ttl;
    }

    public function open(string $path, string $name): bool
    {
        // Can be used for initialization if needed
        return true;
    }

    public function close(): bool
    {
        // Can be used for cleanup if needed
        return true;
    }

    public function read(string $id): string|false
    {
        $data = $this->redis->get("session:$id");
        return $data === false ? '' : $data; // Return empty string if no data
    }

    public function write(string $id, string $data): bool
    {
        return $this->redis->setex("session:$id", $this->ttl, $data);
    }

    public function destroy(string $id): bool
    {
        return $this->redis->del("session:$id") > 0;
    }

    public function gc(int $max_lifetime): int|false
    {
        // Garbage collection in Redis happens automatically via TTL
        return 0;
    }

    public function create_sid(): string
    {
        // You can use the standard implementation or generate your own
        return bin2hex(random_bytes(16));
    }
}

Registering the handler:

<?php

// Assuming the Redis object is already created and connected
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$handler = new RedisSessionHandler($redis);
session_set_save_handler($handler, true); // true for automatic closing

session_start(); // Start the session

Other options:

  • Use a ready-made session handler implementation from a framework or third-party library.
  • Change the session.save_handler directive value in php.ini to the desired handler (e.g., redis or memcached) if the corresponding PHP extension is installed and configured.
How to prevent sessions from being saved in files… - sobes.tech