场景假设:
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);