session_id 生成原理


PHPSESSID生成

生成規則是根據hash_func散列來生成的,相關的參數有: 
- 客戶端IP 
- 當前時間(秒) 
- 當前時間(微妙) 
- PHP自帶的隨機數生產器

hash_func是phpinfo中的session.hash_function配置。如下:

; Select a hash function for use in generating session ids. ; Possible Values ; 0 (MD5 128 bits) ; 1 (SHA-1 160 bits) ; This option may also be set to the name of any hash function supported by ; the hash extension. A list of available hashes is returned by the hash_algos() ; function. ; http://php.net/session.hash-function session.hash_function=0

PHP session工作原理

以下以cookie傳輸PHPSESSID描述。 
1. 客戶端請求一個php的服務端地址。 
2. 服務端收到請求,此次php腳本中包含session_start()。 
3. 服務端會生成一個PHPSESSID。(默認session存儲方式為session.save_handler=files,文件形式存儲。生成的session文件名規則即為sess_PHPSESSID,session文件存在session.save_path中。) 
4. 服務端響應首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客戶端生成一個cookie保存此PHPSESSID。 
5. 此時,客戶端的cookie里面包含了PHPSESSID,之后客戶端的每次請求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服務端之后每次接收到客戶端的請求就都能根據這個PHPSESSID來找到服務端的session文件,通過對這個session文件的讀寫操作即實現了session的超全局變量屬性。

如果客戶端禁用了cookie,由於無法使用cookie傳遞PHPSESSID,那么客戶端每次請求,服務端都會重新建立一個session文件,而無法通過通過PHPSESSID來重用session文件,所以session也就失效了。 
這種情況可以設置session.use_trans_sid來傳輸PHPSESSID,具體實現方式與cookie的區別就是將PHPSESSID通過HTTP的GET傳輸。每次請求的地址里面都會補全PHPSESSID參數”url?PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”來實現。

PHPcli模式通過session_id()使用session

官網說明 
可以通過它來獲取當前會話的PHPSESSID,也可以通過它來設置當前的會話PHPSESSID。 
PHPcli模式下可以通過設置這個,達到使用session的目的,非常方便。 
例如:

<?php // session_id('vingbrv8m64asth0nhplu9gmb7'); session_start(); $_SESSION[md5(rand(100,999))] = rand(100,999); var_dump($_SESSION);

未使用session_id()的時候,在cli模式下運營此php腳本三次: 
這里寫圖片描述 
可以看到由於cli模式下沒有傳輸PHPSESSID,所以每次都是一次性的session使用。session沒有生效。 
查看下session文件: 
這里寫圖片描述 
這三個session文件是我們三次cli執行生成的。三個session文件的內容如下: 
這里寫圖片描述 
這里寫圖片描述 
這里寫圖片描述

將之前的session文件刪除掉,然后如果我們使用session_id(),為cli腳本設定固定的PHPSESSID。

<?php session_id('vingbrv8m64asth0nhplu9gmb7'); session_start(); $_SESSION[md5(rand(100,999))] = rand(100,999); var_dump($_SESSION);

然后cli運行腳本三次: 
這里寫圖片描述 
再查看下session文件,就只有一個我們設置的session文件: 
這里寫圖片描述 
文件內容: 
這里寫圖片描述

 

在服務器端生成的session_id  會通過相應頭部分,寫入到瀏覽器中

Set-Cookie ECSCP[admin_id]=1; expires=Sun…T; Max-Age=31536000; httponly
Set-Cookie ECSCP[admin_pass]=a8e22f0c201b…T; Max-Age=31536000; httponly

往瀏覽器中 寫入兩個cookie

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM