Symfony2. Разные сессии для Prod и Test на одном домене
17 сентября 2014 Symfony2 12325 просмотров
Очень популярным вариантом тестирования проекта перед релизом является его установка на боевом сервере, но с тестовыми настройками, к которым относятся: тестовая база данных, вывод ошибок, поддомен. Например, вы устанавливаете Prod-версию на домен example.com, а тестовую версию на test.example.com. В таком случае может возникнуть такая ситуация, когда сессии с Prod-окружения доступны на Test, и наоборот.

Связано это с тем, что по умолчанию в Symfony2 параметр session.cookie_doman является пустым, а также session.name одинаков для всех окружений, что приводит к тому, что сессии расшариваются между всеми поддоменами и доменом. Это хорошо, но сессия test-поддомена должна быть отдельно.

Решением будет установить в конфиге правильные cookie_domain и name. Но сначала введем еще одно условие: кроме поддомена для тестирования у нас еще будут 2 поддомена для мобильной версии приложения. Итого, что мы имеем:

  • example.com
  • test.example.com
  • m.example.com
  • m.test.example.com

Из такой схемы логичным будет то, что есть общая сессия для example.com и m.example.com, и общая для test.example.com и m.test.example.com.

cookie_domain для Prod мы установим как .example.com, а для Test - .test.example.com. Но тут будет такая ситуация, что на test.example.com мы можем иметь 2 сессии (потому что test.example.com соответствует двум cookie_domain). Для этого нам понадобится установить различные имена сессий:

config_prod.yml
framework:
    session:
        name: SFSESSIDPROD
        cookie_domain: .example.com
config_test.yml
framework:
    session:
        name: SFSESSIDTEST
        cookie_domain: .test.example.com
Для более гибкой настройки, вы можете воспользоваться значением переменной %kernel.environment%.

Cannot set session ID after the session has started

Возможно, вы столкнетесь с такой ошибкой на тестовом сервере. Я думал, что проблема кроется в настройках сессии, но, как оказалось, дело было в другом. Почему-то config_test.yml наследуется от config_dev.yml. Я же считаю, что все конфиги должны наследоваться от дефолтного config.yml. Стоило мне это изменить, и ошибка пропала.

session.auto_start

В дополнение хочу посоветовать всегда устанавливать этот параметр равным 0, что советуют сами разработчики Symfony2.