Мне нужно перенести сеанс пользователя по серверам. то есть. Если пользователь вошел в систему server1, и если пользователь существует на сервере2, то мне нужно передать данные сеанса пользователя на server2. Для этого я использовал следующую технику
С сервера1 перенаправляйте пользователя на http: //server2/auth_from_server1.php? Sessionid = 12345 На сервере2 (внутренне, в PHP-коде auth_from_server1.php) выполните запрос на http: //server1/secret/check_session_id.php с sessionid, 12345. На сервере1, в реализации 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();
Заранее спасибо….
Не было бы проще просто хранить данные сеанса в общей папке?
В качестве альтернативы вы можете сохранить его в базе данных.
Я бы предложил написать собственный обработчик сеанса 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
Когда сервер 2 вызывает server1 / secret / check_session_id.php, он должен предоставить идентификатор сеанса, такой как server1 / secret / check_session_id.php? Sessionid = 12345, а в check_session_id.php вам нужно вызвать session_id($_GET['sessionid'])
до session_start()
.
Еще одна возможность – обмен файловой системой. Поскольку PHP помещает сеанс в файловую систему, вы можете совместно использовать файловую систему (например, sshfs) на обоих серверах.
параметр для изменения каталога назначения в php.ini
session.save_path
Я думаю, что хранить идентификатор пользователя в БД – это наиболее подходящий способ сделать это. Это способ доказательства ошибок.
ура
Эта проблема может быстро выйти из рук, когда вы начнете добавлять к проблеме все больше и больше проблем. Одним из лучших решений, которые я нашел, является сохранение сеанса в базе данных и совместное использование этой базы данных с серверами. Redis обычно отлично подходит для этого. Вот отличный справочник для начала работы с redis