Home > Article > Backend Development > How to implement session sharing in php
Why do we need session sharing?
Nowadays, slightly larger websites basically have several subdomains, such as www.feiniu.com, search.feiniu.com, member.feiniu.com, if these websites need to share user login information, they need to share sessions. Of course, the premise is that they have the same primary domain name.
The session principle of PHP?
The client accesses the php page, executes session_start, and generates the session_id. Generally, we store the session_id On the cookie, the session content is saved on the server.
The client will pass the session_id to the server when accessing different pages, and obtain the session content through the session_id. (Recommended learning: PHP programming from entry to proficiency)
The process is like this, but different servers will generate different session_ids for the same client, so different servers cannot get the same session_id. session content.
And PHP's default SESSION data is stored separately in the file system of this server.
So if we want to solve session sharing, we must solve two problems:
Multiple servers use the same session_id
这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以 打开PHP.ini, 设置session.cookie_domain = .feiniu.com, 当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");
Multiple servers use the same session_id to access the same session content
要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的, 一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储。
How to choose a storage engine?
Default file Storage:
这种方式的session销毁依托于php垃圾收集器,在高并发或销毁时间较长的情况下,在SESSION目录下产生大量文件,当然可以设置 分级目录进行 SESSION 文件的保存。 这会导致两个问题:第一、查找文件慢;第二,每个目录下可容纳的文件数是有限的,可能会导致新SESSION储存失败。
Database storage:
把Session存储在数据库里可以防止Session数据被垃圾收集器删除,可以固化存储session数据。 但是用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。
memcache storage:
以这种方式来同步session,不会加大数据库的负担,并且安全性比较高,把session放到内存里面,比从文件中读取要快很多。 但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片, 如果存储块不足,还会产生内存溢出。 那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统 效率,因为网络连接同样需要资源。
redis storage: Compared with memcache, redis access is slightly slower. The advantage is:
redis支持的数据结构较多,可以存储数组或对象,而memcache只能存储字符串。 在session机器重启的情况下,memcache所有用户都必须重新获得 session,而redis不会。3.在突然涌来大量用户产生了很多数据把 存储 session 的机器内存占满了的情况下,memcache会罢工,所有key都没过期的话就不停的覆盖最后写入的数据,而redis只是会变 慢,不会影响程序的逻辑
The above is the detailed content of How to implement session sharing in php. For more information, please follow other related articles on the PHP Chinese website!