不同服务器上子域的 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 上,因为它位于另一台服务器上。所有子域上的会话 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 响应中,我发现为会话设置了这些变量,但不幸的是为 cURL 调用创建了一个新的会话 id。我尝试通过现有的会话 ID 来解决此问题,但没有成功。
我知道其他选择,但对这种方法特别感兴趣。
I have 3 domains:
- member.example.com for centralizer login on SERVER1
- news.example.com for news on SERVER1
- video.example.com for videos on another server SERVER2
For cross sub domain sessions I'm using:
session_name('example');
session_set_cookie_params(0, '/', '.example.com');
session_start();
When a user logs onto member.example.com, all of the session data is available on news.example.com
but not on video.example.com because it is on another server. The session id is the same on all subdomains, but since it's a different physical box, the session file is not there.
I'm looking for the best method to be able to share sessions across subdomains when the subdomains are hosted on different physical servers.
I know the approach of storing the data in a database, but wish to avoid this.
I also know I can send encrypted session information in the URL for video.example.com, but I feel it is ugly, and I want to create a clean solution.
After traversing cookies, and other implementations, I explored the following scenario.
In members.example.com after successfully logging in, I tried to create a session for video.example.com by calling a session generation page on video.example.com using cURL. I tried using the following code (and passing the appropriate fields with cURL):
session_name('example');
session_set_cookie_params(0, '/', '.example.com');
session_start();
$_SESSION['id']=$_POST['id'];
$_SESSION['name']=$_POST['name'];
print_r($_SESSION)
In the cURL response I found these variables set for session but unfortunately a new session id was created for the cURL call. I tried to resolve this by the existing session ID, but it did not work.
I am aware of other options, but am specifically interested in this approach.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
两台服务器上的会话 ID、会话名称、Cookie 参数和其他会话设置必须相同。因此,您应该将
session_name()
、session_id()
、其他会话参数和会话数据发送到视频服务器。然后在您创建的视频上尝试它是否有效。
On both severs session id, session name, cookie params and other session settings must be the same. So you should send
session_name()
,session_id()
, other session params and session data to video server. Then on video you createtry if it works.
老问题,可能是新的/更好的答案。
我们使用具有自动扩展策略的 AWS,因此,随着负载的增加,我们会获得更多实例来运行我们的代码。
为了解决跨多个实例的会话问题(它们是负载平衡的),我们使用memcached。
PHP 可以相对容易地配置为使用 memcached 作为会话存储。
话虽如此,Memcached 可能不是最适合会话的存储,事后看来,磁盘支持的东西(我想到的是 Redis)可能是更好的解决方案。
Old question, possibly a new/better answer.
We use AWS with an autoscaling policy, so, as the load increases, we get more instances running our code.
To solve the session issue across multiple instances (they are load balanced), we use memcached.
PHP can be configured to use memcached as the session store relatively easily.
Having said that, Memcached may not be the most suitable store for sessions and in hindsight, something that is disk backed (Redis comes to mind) may be a better solution.