与Magento共享Session

Magento的Session所有知识没有超过PHP的Cookie/Session范围之内。

场景假设:
Magento应用的访问地址为:http://www.cartz.com/mage,
另一个应用的访问地址为:http://www.cartz.com/service
两个应用在一个域名里面!

当用户登录magento之后,输出$_SESSION['customer_base']['id']=登陆用户ID。
然后用户访问http://www.cartz.com/service输出$_SESSION为空

查看Magento代码,发现导致另外应用不能共享Magento Session的原因是由于下面的设置:
- 设置1. session.save_path = MAGE_DIR . '/var/session'
- 设置2. 使用frontend作为session_name,
- 设置3. 将frontend设置到cookie(setcookie函数实行)时,强制使用
cookie_path = '/mage'
cookie_domain = 'www.cartz.com'

如果仅仅是设置1,2,那么在service应用启动session_start()前只要调用
ini_set('session.save_path' , MAGE_DIR . '/var/session');
session_name('frontend');
就可以访问Magento Session了。但是设置3将导致其他虚拟目录,或者不同域名下的http服务无法该Magento Cookie,这是由浏览器安全决定的。

所以,一种可能的解决办法是:当用户登陆Magento后返回后,将session_id(cookie里frontend值)作为URL参数(如?sid=..)传递给service应用请求,在sevice服务代码session开始前,再加上代码session_id($_GET['sid']),就可以共享session了。
当访问: http://www.cartz.com/service/sess_test.php?sid=gf3k3el3v3nn8ugus7edaslg86,该php代码如下:
const MAGE_DIR = '/var/www/html/mage';
ini_set('session.save_path' , MAGE_DIR . '/var/session');
session_name('frontend');
session_id($_GET['sid']);
session_start();
print_r($_SESSION);

猜你喜欢

转载自koda.iteye.com/blog/1577925