首頁 > 後端開發 > PHP問題 > php如何實現session共享

php如何實現session共享

(*-*)浩
發布: 2023-02-24 13:06:01
原創
4532 人瀏覽過

為什麼要session共享?

現在稍微大一點的網站基本上都有好幾個子域名,比如www.feiniu.com, search.feiniu.com, member.feiniu.com,這些網站如果需要共用使用者登入訊息,那麼就需要做到session共享,當然前提是有相同的主網域。

php如何實現session共享

PHP的session原理?

#客戶端存取php頁面,執行session_start,產生session_id,一般我們是把session_id存儲到cookie上,session內容保存在服務端,

客戶端存取存取不同的頁面都會把session_id傳到服務端,透過session_id來取得session內容。 (推薦學習:PHP程式設計從入門到精通

流程是這樣,可是不同的伺服器會對同一個客戶端產生不同的session_id,這樣的話不同伺服器就不能得到相同的session內容。

且PHP 預設的 SESSION 資料都是分別保存在本伺服器的檔案系統中。

所以我們要解決session共享,就必須解決兩個問題:

#多台伺服器用同一個session_id

这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以
打开PHP.ini, 设置session.cookie_domain = .feiniu.com, 
当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");
登入後複製

多台伺服器用同一個session_id存取到相同的session內容 

要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的,
一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储。
登入後複製

如何選擇儲存引擎?

##預設文件儲存:

这种方式的session销毁依托于php垃圾收集器,在高并发或销毁时间较长的情况下,在SESSION目录下产生大量文件,当然可以设置
分级目录进行 SESSION 文件的保存。
这会导致两个问题:第一、查找文件慢;第二,每个目录下可容纳的文件数是有限的,可能会导致新SESSION储存失败。
登入後複製

資料庫儲存:

把Session存储在数据库里可以防止Session数据被垃圾收集器删除,可以固化存储session数据。
但是用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。
登入後複製

memcache儲存:

以这种方式来同步session,不会加大数据库的负担,并且安全性比较高,把session放到内存里面,比从文件中读取要快很多。
但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,
如果存储块不足,还会产生内存溢出。
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统
效率,因为网络连接同样需要资源。
登入後複製

 

redis儲存:與memcache相比,redis訪問稍微慢一點,好處是:

redis支持的数据结构较多,可以存储数组或对象,而memcache只能存储字符串。
在session机器重启的情况下,memcache所有用户都必须重新获得 session,而redis不会。3.在突然涌来大量用户产生了很多数据把
存储 session 的机器内存占满了的情况下,memcache会罢工,所有key都没过期的话就不停的覆盖最后写入的数据,而redis只是会变
慢,不会影响程序的逻辑
登入後複製

以上是php如何實現session共享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板