日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php的session实现

發布時間:2025/6/17 php 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。