PHP Session with Redis

When deploying a PHP application on Scalingo, you should favor best practices which let you horizontally scale your application. One of these practices is about PHP session.

Issue with Default PHP Sessions

Out of the box, PHP sessions are stored on the filesystem. If you scale your application with multiple containers, the PHP session will be local to one of the container. For instance, in the typical case of an authenticated page, one request out of two will display the user as logged in. The other requests will display the user as logged out. Moreover, after each restart or each deployment, the sessions would be lost as new containers start with a fresh filesystem.

Solutions

One of the solution could be to store the session in a cookie (with encryption to prevent the user from modifying it). An other one is to store the session in a database. Redis is especially suitable in such case.

On Scalingo, the PHP Redis extension is available. Activate it by modifying the composer.json with:

{
  // 
  "require": {
    "ext-redis": "*"
  }
}

Then, configure PHP to use the Redis session handler. Once again, modify the composer.json with:

{
  // 
  "extra: {
    "paas": {
      "php-config": [
        "session.save_handler = redis",
        "session.save_path = 'tcp://host:port?auth=password'"
      ]
    }
  }
}

Customize the session.save_path value with the content of the SCALINGO_REDIS_URL environment variable of your application. More information is available on the official repository.

Finally, redeploy your application. It is now handling PHP session through the Redis database!


mode_edit Suggest edits