PHP 不同域名之间 cookie 和 session 共享
原文 http://www.tuluobo.com/2015/02/01/229.html
最近一段时间在使用一个开源程序时,需要将我们的主网站与现在这个开源程序的登录和注册机制同步,但是我们又不想使两个网站充分混合,而是相对独 立,即多个子网站使用同一个账号可以登录。又主要想以开源程序的数据库为主,那么我们自然而然的想到使用SESSION机制,可以保持两个网站的登陆信息 一致。
SESSION的机制
虽然,我们知道保持和验证登陆,通常都是使用session,但是,session的具体机制是怎样的,估计好多人还是不很明白。其实 session一般情况下默认是需要cookie帮助其完成自己的使命。这话怎么说呢?具体查询php手册我们可以知道,session是存储在服务器 端,每一个session都有自己的sessionid,这个sessionid一般是以保存在cookie中传递到浏览器,保存在客户端,用户在一次会 话中会多次将sessionid传递到服务器以获得对应session。这样才能保证session信息的正确性, 从而保证用户登录信息之间的独立性。
所以,我们想要使用session,我们必定需要开启cookie,设置cookie,而恰好php中的session机制在内部已经设置了cookie信息,我们使用起来只需要两句话就可以了。且看:
session_start(); //开启session $_SESSION['userinfo'] = $user; //将变量的信息存入session
有的人可能会说为什么在某次项目中,我们需要关闭cookie,但是我们也同时使用了session,那么这就要从sessionid说起,刚才 我们说到session是通过它的id在服务器端检索的,所以这里我们想要取得session,我们就需要知道sessionid,但是cookie被禁 止,那么sessionid怎么获得?这就需要另外一种方式,客户端通过http请求传递参数,服务端通过此参数可以生成或者取到存在别处的 sessionid,这样就得到了session信息。
COOKIE的机制
比起session,大家应该相对更了解cookie吧,那么我在这里只说一下我们需要用到的一个属性,其他的机制大家可以参考php官方文档。
这个属性就是cookie域,我们需要设置我们的cookie所作用的范围,在同一个网站下,一般我们不用单独设置cookie域,默认就是当前 的主机名称,这是为了安全考虑的,设置最小范围域,故没有将域设置为当前的域名,如果一旦要人为将作用域扩大,那么我们就需要设置cookie域了。在此 次应用中,我们需要同一域名下的字网站共享cookie,那么我们需要将cookie设置为:
setcookie("tuluobo.com",$s,time()+3600*12,'/','tuluobo.net');
如此设置将在全域范围内使用cookie,使得各子域名之间的session可共用。
引申
通过这次应用,我又想到了一个问题,本次是在同一个服务器下进行的,session保存在同一个位置,那么不同服务器时,子域名之间的共享 session又如何设置?其实session在服务器端的保存方式有三种,一种是文件形式,也是默认形式,一种是内存形式,另一种是数据库形式。那么, 我们只要能将session保存在两个服务器都能找到的地方,这个问题就解决了。显然是以数据库形式保存在数据库或者是以文件形式保存在其他可以同时访问 的存储空间中,是不是很好实现?
还有一个问题,那就是如果是不同域名之间需要共享session,那么又该如何设置?这个我就不写了,如果有童孩有好的想法,不妨和博主在下面一起讨论。