php的session实现
生活随笔
收集整理的這篇文章主要介紹了
php的session实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
??? 對于兩次http請求,如果第一次http請求的重要數(shù)據(jù)要被第二次請求獲取,辦法是將第一次http請求數(shù)據(jù)保存下來,保存的辦法很多,大體上有使用數(shù)據(jù)庫,緩存,文件等等,那么php中的session實現(xiàn)實際上就是用文件保存http請求的重要數(shù)據(jù),我們這里先看看php的session的實現(xiàn)
?
1、我們先看一下瀏覽是否有我們測試服務(wù)器的cookie信息,如果有,先移除掉。
?
?
2、我們開始一個非常簡單的php腳本,從瀏覽器發(fā)起請求。
<?php session_start();if(isset($_SESSION["name"])) {echo $_SESSION["name"]; } else {echo "name set";$_SESSION["name"] = "Tom"; }?
3、我們在服務(wù)器端抓包看一下瀏覽器發(fā)送給web服務(wù)器的數(shù)據(jù)包,可以看到在刪除我們測試服務(wù)器的cookie信息后,發(fā)送過去的http頭不再帶有cookie信息。
4、web服務(wù)器在處理后,會將請求信息轉(zhuǎn)給php處理,php處理后會在response 頭上增加 Set-Cookie:PHPSESSID=xxxxxxxx ,而后web服務(wù)器會把請求頭轉(zhuǎn)給瀏覽器,瀏覽器在收到Set-cookie要求后,會在客戶端增加cookie信息,也就是我們第一步中刪除的cookie信息 5、而后,只要cookie信息存在,從瀏覽器發(fā)出的請求都會把cookie信息作為參數(shù)發(fā)送給web服務(wù)器,而后到php,我們再請求一次,可以抓包看到。 6、前面第四步,我們看到php在response頭上要求瀏覽器Set-Cookie,那么PHP在服務(wù)端做了什么,我們可以看看php調(diào)用了哪些系統(tǒng)函數(shù),至于詳細的實現(xiàn)過程,可以參考php的源碼。我們看看下圖,php打開一個文件/tmp/sess_84uv4bfgrngrgr1285s8a9d8a6文件,實際上這里分成兩步,第一步,就是php在服務(wù)端,先生成一個唯一的id也就是sess_84uv4bfgrngrgr1285s8a9d8a6,以這個id為文件名,在/tmp/目錄下生成一個文件;第二步,將id作為瀏覽器和服務(wù)端通信的一個標識,保存在瀏覽器的cookie信息里面。 open("/tmp/sess_84uv4bfgrngrgr1285s8a9d8a6", O_RDWR|O_CREAT, 0600) = 5 flock(5, LOCK_EX) = 0 fcntl64(5, F_SETFD, FD_CLOEXEC) = 0 fstat64(5, {st_mode=S_IFREG|0600, st_size=15, ...}) = 0 lseek(5, 0, SEEK_SET) = 0 read(5, "name|s:3:\"Tom\";", 15) = 15 chdir("/usr/local/sina_mobile/php/sbin") = 0 clock_gettime(CLOCK_MONOTONIC, {870988, 244632423}) = 0 times({tms_utime=0, tms_stime=1, tms_cutime=0, tms_cstime=0}) = 516512946 brk(0xa174000) = 0xa174000 brk(0xa1b4000) = 0xa1b4000 brk(0xa134000) = 0xa134000 lseek(5, 0, SEEK_SET) = 0 write(5, "name|s:3:\"Tom\";", 15) = 15 close(5) = 0?這里面還看見了tmp文件下session內(nèi)容的存儲格式,我們設(shè)置的name值為Tom,存儲在文件下,是 name|s:3:"Tom";
6、session使用文件的形式存儲是存在缺陷的,我們知道在處理并發(fā)比較大的請求的時候,一般有多臺前端機,使用文件形式將不能實現(xiàn)session共享,一般情況下會使用memcache緩存來實現(xiàn)session共享。下面是網(wǎng)上摘錄的實現(xiàn)session共享的memcache配置方式;方法I: 在 php.ini 中全局設(shè)置
??? session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
方法II: 某個目錄下的 .htaccess :
php_value session.save_handler "memcache"
php_value session.save_path? "tcp://127.0.0.1:11211"
方法III: 再或者在某個一個應(yīng)用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");? 使 用多個 memcached server 時用逗號","隔開,并且和 Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數(shù)"persistent"、"weight"、"timeout"、"retry_interval" 等等,類似這樣的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
如果安裝的PECL是memcached(使用libmemcache庫的那個),則配置應(yīng)為
ini_set("session.save_handler", "memcached"); // 是memcached不是memcache
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp: 結(jié)論: 介紹了php對session的大體實現(xiàn)過程,其實里面也可以看出session的問題,session局限于單服務(wù)器。 對于一個php應(yīng)用部署到多臺服務(wù)器,那么每次訪問可能會到不同服務(wù)器上,那么就會造成session數(shù)據(jù)的不一致,目前有些采用memcache來實現(xiàn)session共享,實際上也是對php的session功能的否定。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yimuren/p/4596038.html
總結(jié)
以上是生活随笔為你收集整理的php的session实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Find Minimum in Rota
- 下一篇: PHPcms 系统简单使用