PHP кросс-субдомена для субдомена на другом сервере - PullRequest
1 голос
/ 15 декабря 2011

У меня есть 3 домена:

  1. member.example.com для централизованного входа на SERVER1
  2. news.example.com для новостей на SERVER1
  3. видео.example.com для видео на другом сервере SERVER2

Для кросс-доменных сессий я использую:

session_name('example');
session_set_cookie_params(0, '/', '.example.com');
session_start();

Когда пользователь входит на member.example.com, вседанные сеанса доступны на news.example.com, но не на video.example.com, поскольку они находятся на другом сервере.Идентификатор сеанса одинаков во всех поддоменах, но поскольку это другое физическое поле, файл сеанса отсутствует.

Я ищу лучший способ, позволяющий обмениваться сеансами между поддоменами, когда субдоменыразмещены на разных физических серверах.

Я знаю подход к хранению данных в базе данных, но хочу этого избежать.Я также знаю, что могу отправить зашифрованную информацию о сеансе в URL для video.example.com, но я чувствую, что это уродливо, и я хочу создать чистое решение.

После обхода файлов cookie и других реализаций яизучил следующий сценарий.

В members.example.com после успешного входа в систему я попытался создать сеанс для video.example.com, вызвав страницу создания сеанса на video.example.com с помощью cURL.Я попытался использовать следующий код (и передать соответствующие поля с помощью cURL):

session_name('example');
session_set_cookie_params(0, '/', '.example.com');
session_start();
$_SESSION['id']=$_POST['id'];
$_SESSION['name']=$_POST['name'];
print_r($_SESSION)

В ответе cURL я нашел эти переменные, установленные для сеанса, но, к сожалению, для вызова cURL был создан новый идентификатор сеанса.Я пытался решить эту проблему с помощью существующего идентификатора сеанса, но он не работал.

Мне известны другие варианты, но я особенно заинтересован в этом подходе.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

На обоих серверах идентификатор сеанса, имя сеанса, параметры cookie и другие параметры сеанса должны быть одинаковыми.Таким образом, вы должны отправить session_name(), session_id(), другие параметры сеанса и данные сеанса на видеосервер.Затем на видео вы создаете

session_name($_POST['name']);
session_set_cookie_params(0, '/', '.example.com');
session_id($_POST['id']);
session_start();
$_SESSION = array_merge($_SESSION, $_POST['session_data']);

попробуйте, если это работает.

0 голосов
/ 21 августа 2017

Старый вопрос, возможно, новый / лучший ответ.

Мы используем AWS с политикой автоматического масштабирования, поэтому при увеличении нагрузки мы получаем больше экземпляров, выполняющих наш код.

Для решенияпроблема сессий в нескольких экземплярах (они сбалансированы по нагрузке), мы используем memcached.

PHP может быть настроен на использование memcached в качестве хранилища сессий относительно легко.быть наиболее подходящим хранилищем для сессий и задним числом, что-то с дисковой поддержкой (вспоминается Redis) может быть лучшим решением.

...