PHP logout效能

來源:互聯網
上載者:User
PHP logout功能
php手冊寫道session_destroy() destroys all of the data associated with the current session. It does not unset any of the global variables associated with the session, or unset the session cookie. To use the session variables again, session_start() has to be called.

In order to kill the session altogether, like to log the user out, the session id must also be unset. If a cookie is used to propagate the session id (default behavior), then the session cookie must be deleted. setcookie() may be used for that.

?

百度知道 寫道

session 是一個會話,在session_start() 的時候建立。
$_SESSION 是一個全域數組,和其他的全域數組沒有任何區別。只是php在建立一個會話的時候,會順便建立一個全域數組來儲存會話的內容,這個數組又剛好叫$_SESSION,和我們自己去建立的其他數組沒有什麼不一樣。
session_start() 執行的時候,開啟了會話,首先是如果該會話沒有被建立,則在系統的tmp目錄中建立了session檔案(預設,可自訂),並且在當前會話的執行指令碼建立全域數組$_SESSION,h這時的$_SESSION是一個空數組。如果會話存在,則讀取session檔案中的內容,建立$_SESSION數組。
session_destroy() ,手冊中明確的說道:destroys all of the data associated with the current session. It does not unset any of the global variables associated with the session, or unset the session cookie. To use the session variables again, session_start() has to be called.
不會刪除 session 的全域變數和 session相關cookie,只是結束了這次會話。作為一個普普通通的全域變數,如果我們不需要樂得話,就將他 unset() 掉。如果想再次開啟會話,就需要再一次session_start(),但是session_start() 重建立立會話,會重新初始化$_SESSION數組,session_start()之後$_SESSION 就又是一個空數組了。

?


?結果是

array(4) { ["username"]=> string(2) "xx" ["user_id"]=> string(1) "7" ["user_level"]=> string(1) "0" ["signed_in"]=> bool(true) }array(4) { ["username"]=> string(2) "xx" ["user_id"]=> string(1) "7" ["user_level"]=> string(1) "0" ["signed_in"]=> bool(true) }array(0) { } 

?

http://www.nowamagic.net/php/php_SessionPrinciple.php 寫道


PHP SESSION原理

我們知道,session是在伺服器端保持使用者會話資料的一種方法,對應的cookie是在用戶端保持使用者資料。HTTP協議是一種無狀態協議,伺服器響應完之後就失去了與瀏覽器的聯絡,最早,Netscape將cookie引入瀏覽器,使得資料可以用戶端跨頁面交換,那麼伺服器是如何記住眾多使用者的會話資料呢?

首先要將用戶端和伺服器端建立一一聯絡,每個用戶端都得有一個唯一標識,這樣伺服器才能識別出來。建議唯一標識的方法有兩種:cookie或者通過GET方式指定。預設配置的PHP使用session的時會建立一個名叫”PHPSESSID”的cookie(可以通過php.ini修改session.name值指定),如果用戶端禁用cookie,你也可以指定通過GET方式把session id傳到伺服器(修改php.ini中session.use_trans_sid等參數)。

我們查看伺服器端session.save_path目錄會發現很多類似sess_vv9lpgf0nmkurgvkba1vbvj915這樣的檔案,這個其實就是session id “vv9lpgf0nmkurgvkba1vbvj915″對應的資料。真相就在這裡,用戶端將session id傳遞到伺服器,伺服器根據session id找到對應的檔案,讀取的時候對檔案內容進行還原序列化就得到session的值,儲存的時候先序列化再寫入。

事實就是這樣,所以如果伺服器不支援session或者你想自訂session,完全可以DIY,通過PHP的uniqid產生永不重複的session id,然後找個地方儲存session的內容即可,你也可以學flickr把session儲存在MySQL資料庫中。
使用session之前為什麼必須先執行session_start()?

瞭解的原理之後,所謂的session其實就是用戶端一個session id伺服器端一個session file,建立session之前執行session_start()是告訴伺服器要種一個cookie以及準備好session檔案,要不然你的session內容怎麼存;讀取session之前執行session_start()是告訴伺服器,趕緊根據session id把session檔案還原序列化。

只有一個session函數可以在session_start()之前執行,session_name():讀取或指定session名稱(比如預設的就是”PHPSESSID”),這個當然要在session_start之前執行。
session影響系統效能

session在大訪問量網站上確實影響系統效能,影響效能的原因之一由檔案系統設計造成,在同一個目錄下超過10000個檔案時,檔案的定位將非常耗時,PHP支援session目錄hash,我們可以通過修改php.ini中session.save_path = “2;/path/to/session/dir”,那麼session將儲存在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHP session不支援建立目錄,你需要事先把那麼些目錄建立好 。

還有一個問題就是小檔案的效率問題,一般我們的session資料都不會太大(1~2K),如果有大量這樣1~2K的檔案在磁碟上,IO效率肯定會很差,PHP手冊上建議使用Reiserfs檔案系統,不過Reiserfs的前景堪憂,Reiserfs的作者把媳婦給殺了,SuSE也拋棄了Reiserfs。

其實還有很多中儲存session的方式,可以通過php -i|grep “Registered save handlers”查看,比如Registered save handlers => files user sqlite eaccelerator可以通過檔案、使用者、sqlite、eaccelerator來存,如果伺服器裝了memcached,還有會mmcache的選項。當然還有很多,比如MySQL、PostgreSQL等等。都是不錯的選擇。
session的同步

我們前端可能有很多台伺服器,使用者在A伺服器上登入了,種下了session資訊,然後訪問網站的某些頁面沒準跳到B伺服器上去了,如果這個時候B伺服器上沒有session資訊又沒有做特殊處理,可能就會出問題了。

session同步有很多種,如果你是儲存在memcached或者MySQL中,那就很容易了,指定到同樣的位置即可,如果是檔案形式的,你可以用NFS統一儲存。

還有一種方式是通過加密的cookie來實現,使用者在A伺服器上登入成功,在使用者的瀏覽器上種上一個加密的cookie,當使用者訪問B伺服器時,檢查有無session,如果有當然沒問題,如果沒有,就去檢驗cookie是否有效,cookie有效話就在B伺服器上重建session。這種方法其實很有用,如果網站有很多個子頻道,伺服器也不在一個機房,session沒辦法同步又想做統一登入那就太有用了。

當然還有一種方法就是在負載平衡那一層保持會話,把訪問者綁定在某個伺服器上,他的所有訪問都在那個伺服器上就不需要session同步了,這些都是營運層面的東西。就說這麼多吧,根據自己的應用來選擇使用session,不要因為大家都說session影響系統效能就畏首畏尾,知道問題,解決問題才是關鍵,惹不起躲得起不適合這裡。

?刪除session和相關的cookie的方法


?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.