Sharing session between Symfony1 and Symfony2 using Memcache
Nicolas Thal2 min read
Not long ago, Theodo released it’s SessionBundle which aim is to share the session between a symfony1x and a Symfony2 website.
On a local server, very little configuration is needed to use this bundle. The sharing is available after a few minutes configuration.
When we implemented it on one website, the session sharing was working on our Vagrant box, but once it has been deployed we noticed that it was not working anymore.
The platform used by this website was configured to be able to accept more servers if needed, so the sesssion was stored on a memcache server.
We can deal with this in 3 simple steps:
1. Check the Symfony1
2. Setup the Symfony2
3. Setup the session sharing
Pre-configuration
Install the php5-memcache package using either pecl or apt-get:
apt-get install php5-memcache pecl install memcache
Add a file in your php config directory (/etc/php5/conf.d/999.memcache.ini) to force the memcache session torage:
session.save_handler = “memcache” session.save_path = “memcache.server:11211”
Symfony 1x
Configure your application with the following directive:
memcache_enabled: true .array: server_01: server_address: memcache.server server_port: 11211
Symfony 2.2
Install the TheodoEvolutionSessionBundle and follow the installation directive.
By default, Symfony2 overrides the php.ini directive to store the session.
You will have to define a service in the config.yml file to store the session in memcache:
services: memcache: class: Memcache calls: - [ addServer, [ %memcache_host%, %memcache_port% ]] session.handler.memcache: class: Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandler arguments: [ @memcache, { expiretime: %memcache_expire% } ]
You will also have to specify some arguments for the session in your config.yml file:
session: handler_id: %session_handler_id% name: frontend_session #Or put the name related to your symfony application save_path: %session_save_path% cookie_domain: %session_cookie_domain%
Put the parameters into your parameter.yml file:
memcache_host: memcache.test memcache_port: 11211 memcache_expiretime: 86400 session_handler_id: session.handler.memcache session_save_path: ‘tcp://memcache.server:11211’ session_cookie_domain: .test.fr
Session with subdomains
If the Symfony2 webserver is accessed by a subdomain, you will need to make your session cookie from the symfony1x accessible by it.
In the factories.yml add the following configuration:
storage: param: session_domain_cookie: .test.fr
If you look deeper into the session sharing, on the symfony1x the cookie should looks like session_number
On your local server, if you list all the files in the /var/lib/php5 directory, you will see a file prefix by sess_ and followed by the session_number.
On the memcache server, there are no prefixes, so you just have to set it in your parameters.yml file:
session_prefix: ”
Note:
You cannot set the session prefix to ~, the default prefix will be used