在PHP中跨服务器传输会话

时间:2010-12-13 10:49:41

标签: php session sessionid

我需要跨服务器传输用户会话。即。如果用户登录server1并且用户存在于server2中,那么我必须将用户会话详细信息传输到server2。为此,我使用了以下技术

从server1,将用户重定向到http://server2/auth_from_server1.php?sessionid=12345 在server2上(在内部,在auth_from_server1.php的PHP代码中),使用sessionid 12345向http://server1/secret/check_session_id.php发出请求。 在server1上,在check_session_id.php的实现中,验证ID并返回要传递的OK,FAILURE和会话相关数据,例如用户名,... 在server2上,当调用返回OK时,存储传输的会话数据,并为用户提供该服务器的cookie和会话。

但是当回调函数调用auth_from_server1.php时,session id中的值为null。我试着将sessionid检查为

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

但$ _SESSION ['sessionId']为空。在登录页面中,我将会话ID的值设置为

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

提前致谢....

6 个答案:

答案 0 :(得分:17)

将会话数据存储在共享目录中会不会更容易?

或者,您可以在数据库中store it

答案 1 :(得分:7)

我建议编写自定义PHP会话处理程序或使用预构建的会话处理程序,如ShareDance。您可以将会话信息存储在两台计算机,SQLite文件等共享的MySQL数据库中。

使用PHP的内置功能通过使用session_set_save_handler()来获取/设置会话数据有许多好处,即所有从$ _SESSION获取或设置的调用都将在您的应用程序代码中起作用而无需任何其他修改。

可在此处找到更多信息: http://php.net/manual/en/function.session-set-save-handler.php

编写自定义会话处理程序(旧的但仍然相关)的教程在这里: http://devzone.zend.com/article/141

答案 2 :(得分:3)

当服务器2调用server1 / secret / check_session_id.php时,它必须提交会话ID,如server1 / secret / check_session_id.php?sessionid = 12345,并且在check_session_id.php中,您必须在{{{}之前调用session_id($_GET['sessionid']) 1}}。

答案 3 :(得分:3)

另一个机会可能是共享文件系统。 由于PHP将会话放在文件系统中,因此您可以在两台服务器上共享文件系统(例如sshfs)。

更改php.ini中的目标目录的设置是

session.save_path

答案 4 :(得分:3)

当您开始为问题添加越来越多的服务器时,此问题可以迅速解决。我发现的最佳解决方案之一是将会话存储在数据库中并与服务器共享该数据库。 Redis通常对此非常有用。这是get started with redis

的精彩指南

答案 5 :(得分:2)

我认为在DB中存储用户的id是最合适的方法。这是一种防错方式。

干杯