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