前端學PHP之會話Session

來源:互聯網
上載者:User

標籤:bool   ini   etc   指定   緩衝   context   字串   中文   方法   

前面的話

  Session技術和Cookie相似,都是用來儲存使用者的相關資料。但最大的不同之處在於Cookie是將資料存放在用戶端的電腦之中,而Session則是將資料存放於伺服器系統之下。Session的中文意思是會話,在Web系統中,通常是指使用者與Web系統的對話過程。本文將詳細介紹Session的內容

 

Session ID

  在Web技術發展史上,雖然Cookie技術的出現是一個重大的變革,但Cookie是在用戶端的電腦中儲存資料,所以引起了一個爭議。使用者有權阻止Cookie的使用,使Web伺服器無法通過Cookie來跟蹤使用者資訊。而Session技術是將使用者相關的資料存放在伺服器的系統之下,所以使用者無法停止Session的使用

  Session在用戶端僅需要儲存由伺服器為使用者建立的一個Session標識符,稱為Session ID,而在伺服器端(檔案或資料庫或MemCache中)儲存Session變數的值。Session ID是一個既不會重複,又不容易被找到規律的,由32位16進位數組成的字串

  Session ID會儲存在用戶端的Cookie中,如果使用者阻止Cookie的使用,則可以將Session ID儲存在使用者瀏覽器地址欄的URL中。當使用者請求Web伺服器時,就會把Session ID發送給伺服器,再通過Session ID提取儲存在伺服器中的Session變數。可以把Session中儲存的變數,當做是這個使用者的全域變數,同一個使用者對每個指令碼的訪問都共用這些變數

  當某個使用者向Web伺服器發出請求時,伺服器首先會檢查這個用戶端的請求裡是否已經包含了一個Session ID。如果包含,說明之前已經為此使用者建立過Session,伺服器則按該Session ID把Session檢索出來使用。如果用戶端請求不包含Session ID,則為該使用者建立一個Session,並且產生一個與此Session相關聯的Session ID,在本次響應中被傳送給用戶端儲存

【session_start()】

  使用者向Web伺服器發出請求時,必須首先使用session_start()函數來啟動新會話或者重用現有會話,成功開始會話返回TRUE,反之返回FALSE

bool session_start ([ array $options = [] ] )

  因為基於Cookie的Session是在開啟的時候,調用session_start()函數會產生一個唯一的SessionID,需要儲存在用戶端電腦的Cookie中,和setCookie()函數一樣,調用之前不能有任何的輸出,空格或空行也不行

  如果已經開啟過Session,再次調用Session_start()函數時,不會再建立個新的Session ID。因為當使用者再次訪問伺服器時,該函數會通過從用戶端攜帶過來的Session ID,返回已經存在的Session。所以在會話期間,同一個使用者在訪問伺服器上任何一個頁面時,都是使用同一個 Session ID

session_start();

  而且,使用session_start()方法會在伺服器端建立一個同名的Session檔案(文字檔)

  如果不想在每個指令碼都使用Session_start()函數來開啟Session,可以在php.ini裡設定"session.auto_start=1",則無須每次使用Session之前都要調用session_start()函數。但啟用該選項也有一些限制,則不能將對象放入Session中,因為類定義必須在啟動Session之前載入。所以不建議使用php.ini中的session.auto_start屬性來開啟Session

 

讀寫session

  使用session_start()方法啟動session會話後,要通過訪問$_SESSION數組來讀寫session。和$_POST、$_GET、$_COOKIE類似,$_SESSION也是超全域數組

  使用$_SESSION數組將資料存入同名Session檔案中

<?phpsession_start();$_SESSION[‘username‘] = ‘huochai‘;$_SESSION[‘age‘] = 28;?>

  同名Session檔案可以直接使用文字編輯器開啟,該檔案的內容結構如下所示:

變數名|類型:長度:值;

<?phpsession_start();print_r ($_SESSION);//Array ( [username] => huochai [age] => 28 )?>

  Session變數會被儲存在伺服器端的某個檔案中,該檔案的位置是通過php.ini檔案,在session.save_path屬性指定的目錄下

 

配置Session

  在PHP設定檔php.ini中,有一組和Session相關的配置選項。通過對一些選項重新設定新值,就可以對Session進行配置,否則使用預設的Session配置

phpinfo();
session.auto_start=0;在請求啟動時初始化sessionsession.cache_expire=180;設定緩衝中的會話文檔在n分鐘後過時session.cookie_lifetime=0;設定cookie儲存時間(s),相當於設定Session到期時間,為0時表示直到瀏覽器被重啟session.cookie_path=/;cookie的有效路徑session.cookie_domain=;cookie的有效域session.name=PHPSESSID;用在cookie裡的session的名字session.save_handler=files;用於儲存/取回資料的控制方式session.save_path=/tmp;在save_handler設為檔案時傳給控制器的參數,這是資料檔案將儲存的路徑.session.use_cookies=1;是否使用cookies

 

銷毀Session

  當使用完一個Session變數後,可以將其刪除,當完成一個會話後,也可以將其銷毀。如果使用者想退出Web系統,就需要提供一個登出的功能,把所有資訊在伺服器中銷毀。銷毀和當前Session有關的所有的資料,可以調用session_destroy()函數結束當前的會話,並清空會話中的所有資源

【session_destroy()】

bool session_destroy ( void )    

  session_destroy()銷毀當前會話中的全部資料,刪除同名Session檔案,但是不會重設當前會話所關聯的全域變數,也不會重設會話cookie。如果需要再次使用會話變數,必須重新調用session_start()函數

<?phpsession_start();session_destroy();?>

  可以使用unset()函數來釋放在Session中註冊的單個變數

print_r ($_SESSION);//‘Array ( [username] => huochai [age] => 28 )‘unset($_SESSION[‘username‘]);unset($_SESSION[‘age‘]);print_r ($_SESSION);//‘Array()‘

  [注意]不要使用unset($_SESSION)刪除整個$_SESSION數組,這樣將不能再通過$_SESSION超全域數組註冊變數了

  如果想把某個使用者在Session中註冊的所有變數都刪除,可以直接將陣列變數$_SESSION賦值為一個空數組

$_SESSION=array();    

  PHP預設的Session是基於Cookie的,Session ID被伺服器儲存在用戶端的Cookie中,所以在登出Session時也需要清除Cookie中儲存的SessionID,而這就必須藉助setCookie()函數完成。在Cookie中,儲存Session ID的Cookie標識名稱就是Session的名稱,這個名稱是在php.ini中,通過session.name屬性指定的值。在PHP指令碼中,可以通過調用session_name()函數擷取Session名稱。刪除儲存在用戶端Cookie中的Session ID

if(isset($_COOKIE[session_name()])) {    setCookie(session_name(),‘‘,time()-3600);}

  通過前面的介紹可以總結出來,Session的登出過程共需要四個步驟

<?php//第一步:開啟Session並初始化session_start();//第二步:刪除所有Session的變數,也可用unset($_SESSION[xxx])逐個刪除$_SESSION = array();//第三步:如果使用基於Cookie的Session,使用setCooike()刪除包含Session Id的Cookieif (isset($_COOKIE[session_name()])) {    setcookie(session_name(),‘‘, time()-42000);}//第四步:最後徹底銷毀Session,刪除伺服器端保留session資訊的檔案session_destroy();?>

 

自動回收

  如果沒有通過上述步驟銷毀Session,而是直接關閉瀏覽器,或斷網等情況,在伺服器端儲存的Session檔案是不會被刪除的。因為在php.ini設定檔中,預設的session.cookie_lifetime=0,表示Session ID在用戶端Cookie的有效期間限為直到關閉瀏覽器。Session ID消失了,但伺服器端儲存的Session檔案並沒有被刪除。所以,沒有被Session ID關聯的伺服器端Session檔案成為了垃圾,而系統則提供了自動清理的機制

  伺服器儲存的Session檔案是普通文字檔,都有檔案修改時間。通過在php.ini設定檔中設定session.gc_maxlifetime選項來設定一個到期時間(預設為1440秒,即24分鐘)。記憶體回收程式在所有Session檔案中排查出大於24分鐘的檔案。如果使用者還在使用該檔案,那麼這個Session檔案的修改時間就會被更新,將不會被排查到

  排除出來後,並不會立刻清理垃圾,而是根據設定檔php.info中session.gc_probability/session.gc_divisor這兩個值的比例來決定何時清理,預設值是1/100。表示排查100次,才有一次可能會啟動記憶體回收機制,來自動回收垃圾。當然,這個值是可以修改的,但還是要兼顧伺服器的運行效能和儲存空間

 

前端學PHP之會話Session

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.