Storing Symfony Sessions in MongoDB

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.

Leave a Reply

Your email address will not be published. Required fields are marked *