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