Session會話管理(PHP,Apacha)

weixin_33936401發表於2017-09-24

Session存在的意義:為了解決HTTP是個無狀態協議所帶來的問題。

那怎麼解決呢?一張圖告訴你。


7131940-04219a336a772855.png
Session流程圖

從圖中可以看出,Session是基於cookie來實現的,當某個使用者訪問伺服器上的某個指令碼程式時(比如apache中執行的PHP檔案),該指令碼程式會在啟動session的情況下自動生成一個隨機的字串,並將其作為cookie值返回到客戶端,並同時在服務上指定的目錄下建立一個session檔案儲存。

該session檔案也是有生命週期的,該session檔案的儲存位置,和生命週期都是可以進行設定的。

如下圖,在谷歌瀏覽器上可以看到儲存訪問的網站中有一個PHPSESSID的cookie,這個就是預設的sessionid(注意:PHPSESSID)這個名字在php.ini中是可以更改的。


7131940-863aec53e6ce17ae.png
cookie


7131940-7945907320721252.png
伺服器中的session檔案

如上圖,是伺服器中儲存的session檔案,通過在客戶端的cookie和伺服器上儲存的session檔案,伺服器就可以和客戶端模擬出一個會話了(其實是一個假會話,並不是像我們打電話一樣,一直都是相通的)

總上所述,其實我們自己也是可以寫一個"所謂的"會話管理的,只要利用cookie,和在服務端保持住一個我們自定義的隨機字串。

只不過session機制已經被伺服器實現了,我們開發者就可以省去了很多事。

而且,在PHP中,session機制是可以被定製,PHP開發了很多介面給開發者。通過這些介面可以配置session機制。


session.save_handler = files

定義了來儲存和獲取與會話關聯的資料的處理器的名字。預設為files

php內配置函式

設定使用者自定義 會話儲存函式。 如果想使用 PHP 內建的會話儲存機制之外的方式, 可以使用本函式。 例如,可以自定義會話儲存函式來將會話資料儲存到資料庫

session_set_save_handler()

www.cocoatest.com/sc/php/php/function.session-set-save-handler.html


session.save_path ="c:/wamp64/tmp"

定義了傳遞給儲存處理器的引數。如果選擇了預設的 files 檔案處理器,則此值是建立檔案的路徑。預設為/tmp

PHP內部配置函式

session_save_path

www.cocoatest.com/sc/php/php/function.session-save-path.html


session.use_strict_mode = 0


session.use_cookies = 1

指定是否在客戶端用 cookie 來存放會話 ID。預設為1(啟用)。


session.use_only_cookies = 1

指定是否在客戶端僅僅使用 cookie 來存放會話 ID。。啟用此設定可以防止有關通過 URL 傳遞會話 ID 的攻擊。此設定是 PHP 4.3.0 新增的。


session.name = PHPSESSID

指定會話名以用做 cookie 的名字。只能由字母數字組成,預設為PHPSESSID

PHP內部配置函式

session_name

www.cocoatest.com/sc/php/php/function.session-name.html


session.auto_start = 0

指定會話模組是否在請求開始時自動啟動一個會話。預設為0(不啟動)


session.cookie_lifetime = 0

以秒數指定了傳送到瀏覽器的 cookie 的生命週期。值為 0 表示“直到關閉瀏覽器”。預設為0

php內部函式

獲取/設定會話 cookie 引數(注意:是會話cookie)

session_get_cookie_params()

www.cocoatest.com/sc/php/php/function.session-get-cookie-params.html

voidsession_set_cookie_params(int$lifetime[,string$path[,string$domain[,bool$secure= false[,bool$httponly= false]]]] )

www.cocoatest.com/sc/php/php/function.session-set-cookie-params.html


session.cookie_path = /

指定了要設定會話 cookie 的路徑。

詳細功能見上面


session.cookie_domain =

指定了要設定會話 cookie 的域名。預設為無,表示根據 cookie 規範產生 cookie 的主機名。


session.cookie_httponly =

Marks the cookie as accessible only through the HTTP protocol. This means that the cookie won't be accessible by scripting languages, such as JavaScript. This setting can effectively help to reduce identity theft through XSS attacks (although it is not supported by all browsers).


session.cookie_secure=off

指定是否僅通過安全連線傳送 cookie。預設為off。


session.serialize_handler = php

定義用來序列化/解序列化的處理器名字。當前支援 PHP 內部格式(名為php)和 WDDX(名為wddx)。如果 PHP 編譯時加入了WDDX 支援,則只能用 WDDX。預設為php


session.gc_probability = 1

session.gc_divisor = 1000

session.gc_divisorsession.gc_probability合起來定義了在每個會話初始化時啟動 gc(garbage collection 垃圾回收)程式的概率。此概率用 gc_probability/gc_divisor 計算得來。例如 1/100 意味著在每個請求中有 1% 的概率啟動 gc 程式。session.gc_divisor預設為100


session.gc_maxlifetime = 1440

指定過了多少秒之後資料就會被視為“垃圾”並被清除。

Note:

如果不同的指令碼具有不同的session.gc_maxlifetime數值但是共享了同一個地方儲存會話資料,則具有最小數值的指令碼會清理資料。此情況下,與session.save_path一起使用本指令。

Note:如果使用預設的基於檔案的會話處理器,則檔案系統必須保持跟蹤訪問時間(atime)。Windows FAT 檔案系統不行,因此如果必須使用 FAT 檔案系統或者其他不能跟蹤 atime 的檔案系統,那就不得不想別的辦法來處理會話資料的垃圾回收。自 PHP 4.2.3 起用 mtime(修改時間)來代替了 atime。因此對於不能跟蹤 atime 的檔案系統也沒問題了。


session.referer_check =

包含有用來檢查每個 HTTP Referer 的子串。如果客戶端傳送了 Referer 資訊但是在其中並未找到該子串,則嵌入的會話 ID 會被標記為無效。預設為空字串


session.cache_expire = 180

以分鐘數指定緩衝的會話頁面的存活期,此設定對 nocache 緩衝控制方法無效。預設為180


session.use_trans_sid = 0

session.hash_function = 0

session.hash_bits_per_character = 5


有一些還沒有放上去,下面給出連結:

www.cocoatest.com/sc/php/php/session.configuration.html#ini.session.upload-progress.enabled

php.net/manual/zh/session.configuration.php#ini.session.referer-check

www.pureweber.com/article/how-session-works/


session_start();

session_id();

session_abort();


7131940-8b09ab3fd1331267.jpg
一個每日更新的乾貨公眾號

相關文章