2010-12-13 2 views
8

Мне нужно передать сеанс пользователя по серверам. то есть. Если пользователь вошел в систему server1, и если пользователь существует на сервере2, то мне нужно передать данные сеанса пользователя на server2. Для этого я использовал следующую техникуПеренос сеанса через сервер в PHP

С server1, перенаправлять пользователя http://server2/auth_from_server1.php?sessionid=12345 На server2 (внутренне, в PHP коде auth_from_server1.php), сделать запрос на http://server1/secret/check_session_id.php с SessionID, 12345. На server1, в реализация check_session_id.php, проверка идентификатора и возврат OK, FAILURE и связанных с сеансом данных, таких как имя пользователя, ... На сервере2, когда вызов возвращается с OK, сохраняет переданные данные сеанса и предоставить пользователю cookie и сеанс для этого сервера.

Но когда функция обратного вызова вызывает auth_from_server1.php, значение в идентификаторе сеанса равно null. Я попытался проверить sessionid как

if(isset($_SESSION['sessionId'])) 
echo 'true'; 
else 
echo 'false'; 

Но $ _SESSION ['sessionId'] равно null. В странице входа я устанавливаю значение идентификатора сессии в качестве

$_SESSION['sessionId'] = session_id(); 

Спасибо заранее ....

+0

Дубликат http://stackoverflow.com/questions/6490875/how-to-manage-a-single-php5-session-on-multiple-apache-servers – Capsule

ответ

16

Не было бы проще просто хранить данные сеанса в общей папке?

Альтернативно вы можете store it в базе данных.

3

Когда сервер 2 вызовы сервер1/секретный/check_session_id.php он должен представить идентификатор сессии, как server1/тайна/check_session_id.php? SessionID = 12345 и в check_session_id.php вы должны вызвать session_id($_GET['sessionid']) перед тем session_start().

7

Я бы предложил написать собственный обработчик сеанса PHP или использовать предварительно обработанный обработчик сеанса, например ShareDance. Вы можете хранить информацию о сеансе в базе данных MySQL, совместно используемой между двумя машинами, SQLite-файле и т. Д.

Существует множество преимуществ использования встроенной возможности PHP для получения/установки данных сеанса с помощью session_set_save_handler(), а именно, что все вызовы получить или установить из $ _SESSION будут работать в вашем коде приложения без каких-либо дополнительных изменений.

Более подробную информацию можно найти здесь: http://php.net/manual/en/function.session-set-save-handler.php

Учебник по написанию пользовательских сеансов обработчики (старые, но все еще актуально) здесь: http://devzone.zend.com/article/141

3

Еще одна возможность может делить файловую систему. Поскольку PHP помещает сеанс в файловую систему, вы можете совместно использовать файловую систему (например, sshfs) на обоих серверах.

настройки для изменения каталога назначения в php.ini является

session.save_path 
+1

Будет ли общий файл точность системы на нескольких серверах должна быть достаточно быстрой? Большинство общих файловых систем, которые я знаю о съемке для «возможной согласованности», не являются мгновенной консистенцией. –

2

Я думаю, хранить идентификатор пользователя в БД является наиболее подходящим способом сделать this.It ошибка доказательство способ.

Приветствия

2

Эта проблема может быстро выйти из-за руку, когда вы начинаете добавлять все больше и больше разъединяет к этой проблеме.Одним из лучших решений, которые я нашел, является сохранение сеанса в базе данных и совместное использование этой базы данных с серверами. Redis обычно отлично подходит для этого. Вот отличный справочник по get started with redis

+0

Просто имейте в виду, что хранение сеанса в базе данных намного более интенсивно требует процессора и может быстро заглушить сервер, если у вас много трафика. – Vincent

+0

На данный момент мы говорим о нескольких серверах. – Rick

Смежные вопросы