PHP кросс-субдомена для субдомена на другом сервере
У меня есть 3 домена:
- member.example.com для централизованного входа на SERVER1
- news.example.com для новостей на SERVER1
- video.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 ответа
На обоих серверах идентификатор сеанса, имя сеанса, параметры 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']);
попробуйте, если это работает.
Старый вопрос, возможно новый / лучший ответ.
Мы используем AWS с политикой автоматического масштабирования, поэтому, по мере увеличения нагрузки, мы получаем больше экземпляров, выполняющих наш код.
Чтобы решить проблему сеанса в нескольких экземплярах (они сбалансированы по нагрузке), мы используем memcached.
PHP может быть настроен на использование memcached в качестве хранилища сессий относительно легко.
Сказав это, Memcached, возможно, не является наиболее подходящим хранилищем для сессий, и, оглядываясь назад, кое-что, что поддерживается на диске (приходит на ум Redis), может быть лучшим решением.