我有三个域名:
- 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上,因为它在另一个服务器上。会话id在所有子域上是相同的,但是由于它是一个不同的物理盒,所以会话文件不在那里。
当子域托管在不同的物理服务器上时,我正在寻找能够跨子域共享会话的最佳方法。
我知道在数据库中存储数据的方法,但希望避免这种方法。我也知道我可以在video.example.com的URL中发送加密的会话信息,但我觉得它很难看,我想创建一个干净的解决方案。
在遍历了cookie和其他实现之后,我探索了以下场景。
在members.example.com成功登录后,我试图通过使用cURL调用video.example.com上的会话生成页面为video.example.com创建一个会话。我尝试使用以下代码(并通过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响应中,我发现为session设置了这些变量,但不幸的是,为cURL调用创建了一个新的session id。我试图通过现有的会话ID来解决这个问题,但它不起作用。
我知道还有其他选择,但我对这种方法特别感兴趣。
两个服务器的会话id、会话名称、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)可能是一个更好的解决方案。