Storing Symfony Sessions in MongoDB

July 2nd, 2015 (1 minute read)

This post was written about Symfony 2.7. It may or may not be correct for your version of Symfony.

By default, Symfony stores session data using the default handler, which uses the server filesystem. This is fine in most cases, but if you need your app to work on multiple web servers behind a load balancer, the default handler won’t work.

There are a few options, but I will discuss storing session data in a MongoDB database. This post assumes you already have a MongoDB server running.  If you don’t, you can read their site to learn how to do that.

To enable MongoDB session storage, you need to edit your app/config/config.yml file.

First, add this section in your “parameters” section.

parameters:
  mongo.session.options:
    database: session_db # this can be whatever you want
    collection: session # this can be whatever you want
  mongodb_host: 1.2.3.4 # your MongoDB server's IP

Next, add this section in your “framework” section.

framework:
  session:
    handler_id: session.handler.mongo
    cookie_lifetime: 2592000 # optional, I set it to 30 days
    gc_maxlifetime: 2592000 # optional, I set it 30 days

Finally, add this to your “services” section:

services:
  mongo_client:
    class: MongoClient
    arguments: [mongodb://%mongodb_host%:27017]
  session.handler.mongo:
    class: Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandler
    arguments: [@mongo_client, %mongo.session.options%]

I have my MongoDB server setup to only listen on the internal network, so I don’t use a username and password.  However, if you need to do that, you should just add that information to the mongo_client service configuration.