久久无码中文字幕_日韩精品无码一本二本三_久久精品呦女暗网_欧美一级夜夜爽_久久精品国产99久久99久久久

04
2018/08

PHP 項(xiàng)目實(shí)戰(zhàn)開發(fā)中,Session功能常用的函數(shù)

發(fā)布時(shí)間:2018-08-04 09:12:04
發(fā)布者:pengyifeng
瀏覽量:
0

之前我們介紹了session的原理和簡單實(shí)用方法,今天我們?cè)賮碚f說Session中常用的一些函數(shù)

session_start() 會(huì)創(chuàng)建新會(huì)話或者重用現(xiàn)有會(huì)話。

當(dāng)會(huì)話自動(dòng)開始或者通過 session_start() 手動(dòng)開始的時(shí)候, PHP 內(nèi)部會(huì)調(diào)用會(huì)話管理器的 open 和 read 回調(diào)函數(shù)。 會(huì)話管理器可能是 PHP 默認(rèn)的, 也可能是擴(kuò)展提供的, 也可能是通過 session_set_save_handler() 設(shè)定的用戶自定義會(huì)話管理器。 通過 read 回調(diào)函數(shù)返回的現(xiàn)有會(huì)話數(shù)據(jù), PHP 會(huì)自動(dòng)反序列化數(shù)據(jù)并且填充 $_SESSION 超級(jí)全局變量。

要想使用命名會(huì)話,請(qǐng)?jiān)谡{(diào)用 session_start() 函數(shù) 之前調(diào)用 session_name() 函數(shù)。
如果啟用了 session.use_trans_sid 選項(xiàng), session_start() 函數(shù)會(huì)注冊(cè)一個(gè)內(nèi)部輸出管理器, 該輸出管理器完成 URL 重寫的工作。

注意:要使用基于 cookie 的會(huì)話, 必須在輸出開始之前調(diào)用 session_start() 函數(shù)。

session_unset()

銷毀當(dāng)前數(shù)據(jù)。或者$_SESSION = array(); 可以u(píng)nset ($_SESSION['varname']) 來刪除其中的一條數(shù)據(jù);.

session_destroy()和session_unset()銷毀所有會(huì)話數(shù)據(jù)不同,session_destroy()銷毀的是會(huì)話本身,此函數(shù)一出,當(dāng)前session就變成垃圾了,等待gc機(jī)制去回收它。但是它并不會(huì)重置當(dāng)前會(huì)話所關(guān)聯(lián)的全局變量, 也不會(huì)重置會(huì)話 cookie。該有的會(huì)話數(shù)據(jù)還是在,只不過“身份”變了而已。如果gc尚且還沒有去回收它,那么它仍然是可以讀取到的,這當(dāng)然是不愿意看到的,因此在session_destroy() 之前往往還要session_unset()一下。

如果需要再次使用會(huì)話變量, 必須重新調(diào)用 session_start() 函數(shù)。 為了徹底銷毀會(huì)話,比如在用戶退出登錄的時(shí)候,必須同時(shí)重置會(huì)話 ID。 如果是通過 cookie 方式傳送會(huì)話 ID 的,那么同時(shí)也需要 調(diào)用 setcookie() 函數(shù)來 刪除客戶端的會(huì)話 cookie。

下面例子是銷毀數(shù)據(jù)本身:

PHP 項(xiàng)目實(shí)戰(zhàn)開發(fā)中,Session功能常用的函數(shù).jpg

刪除會(huì)話$_SESSION = array() 或session_unset() ;銷毀會(huì)話本身session_destroy();和setcookie()。session_destroy()執(zhí)行后會(huì)話就變成垃圾會(huì)話,等待gc機(jī)制回收。

session_commit() 是 session_write_close()別稱。和session_start相反,這是寫和關(guān)閉。即保存當(dāng)前session數(shù)據(jù),并且關(guān)閉當(dāng)前會(huì)話。為了防止并發(fā)的寫session,任何時(shí)刻只能允許有一個(gè)PHP腳本在操作session,因此,一個(gè)腳本一旦session_start打開session,那么在此腳本終止或者調(diào)用session_write_close()之前,別的任何腳本都不能使用session。在默認(rèn)情況下腳本結(jié)束時(shí)會(huì)自動(dòng)寫入和關(guān)閉session,但是在腳本執(zhí)行時(shí)間比較長的時(shí)候,此腳本就一致占據(jù)鎖使得別的腳本無法使用session,因此導(dǎo)致許多錯(cuò)誤。因此,最佳實(shí)踐是,任何session變量,數(shù)據(jù)的更改(如$_SESSION[xx] = xxx),都要及時(shí)使用session_commit()保存數(shù)據(jù),關(guān)閉會(huì)話。

session_id() 可以用來獲取/設(shè)置 當(dāng)前會(huì)話 ID。 為了能夠?qū)?huì)話 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 獲取以字符串格式表達(dá)的會(huì)話名稱和 ID。簡單說,就是如果你開啟的是POST/GET方式獲取會(huì)話ID,那么這個(gè)參數(shù)可以通過session.use_trans_sid設(shè)定并在URL中看得見,而在腳本中通過全局變量SID來直接獲取。

//配置ini_set('session.use_trans_sid', 'sid');//url中表現(xiàn)127.0.0.1?sid=xxxxx//直接獲取$sid = SID;
  • 如果指定了 session_id () 參數(shù)的值, 則使用指定值作為會(huì)話 ID。 必須在調(diào)用 session_start() 函數(shù)之前調(diào)用 session_id() 函數(shù)。不同的會(huì)話管理器對(duì)于會(huì)話 ID 中可以使用的字符有不同的限制。 如果當(dāng)前沒有會(huì)話,則返回空字符串("")。

  • 這里有兩點(diǎn)值得注意下:

  • 如果使用 cookie 方式傳送會(huì)話 ID,并且指定了 id 參數(shù), 在調(diào)用 session_start() 之后都會(huì)向客戶端發(fā)送新的 cookie, 無論當(dāng)前的會(huì)話 ID 和新指定的會(huì)話 ID 是否相同

  • 在通過session_id ($id )切換當(dāng)前會(huì)話ID之前,需要通過session_commit()來關(guān)閉上一個(gè)會(huì)話,否則當(dāng)前會(huì)話還是原來的


關(guān)鍵詞:
返回列表