2013-08-31 34 views
6

在PHP手冊,用於session_destroy()功能描述是:session_destroy()在PHP中做什麼?

session_destroy(),刪除所有與當前會話相關聯的數據。它不會取消設置與會話關聯的任何全局變量,也不會取消設置會話Cookie。要再次使用會話變量,必須調用session_start()。

我對這個描述感到困惑。如果此函數銷燬所有會話數據,那麼爲什麼與會話關聯的全局變量不會被取消設置?爲什麼我們可以再次使用會話變量?

+0

我想你錯過了同一頁面的以下部分:爲了完全殺掉會話,就像登錄用戶一樣,會話ID也必須未設置。如果使用cookie傳播會話標識(默認行爲),則必須刪除會話cookie。 setcookie()可用於此目的。 – Satya

+0

'x如果這個函數銷燬了所有的會話數據,那麼爲什麼與會話相關的全局變量不會被取消設置?'因爲這樣做沒有意義。下一次請求時,全局變量將消失。 –

+0

您認爲與該會話關聯的全局變量不再與該會話關聯,因爲該會話已被銷燬。您可以將變量用作變量,但不能將其用作會話變量。沒有理由摧毀變量,所以你可能應該增加你的問題,爲什麼你會這麼想,所以你更清楚你問什麼。也許有一些具體問題需要幫助? – hakre

回答

5

我對這個描述感到困惑。如果[session_destroy()]函數銷燬所有會話數據,那麼爲什麼與會話關聯的全局變量不會被取消設置?爲什麼我們可以再次使用會話變量?

會話數據是與會話相關的數據。會話由其名稱(會話名稱)及其ID(會話ID)定義。

通過使用該函數,所有這些會話(名稱+ ID)數據被銷燬。

允許您讀取/設置數據的變量容器仍然存在,因此您可以對該數據進行操作(例如,上次活動中可能存在信息,並且這是註銷並且您希望存儲上次活動在註銷或知道某些日誌或數據庫時,爲什麼要刪除它?這會產生反效果,因爲您想快速銷燬(或提交)會話,例如,當您知道只需要只讀訪問時,將會話數據保存在內存,但已經提交了會話,因爲不需要保持它打開)。

請記住,即使這些變量是通過$_SESSION訪問的,它們不再是會話的一部分。也許這是令人困惑的部分?

順便說一句我的描述並不完全正確。 PHP僅通過id在內部識別會話數據,因此您可以更改會話名稱,並且session_destroy()仍會刪除會話數據,因爲會話ID未更改。

+0

謝謝你的回答。我最初誤解了描述。我用會話變量弄糟會話數據。 – PixelsTech

1

session_destroy()刪除存儲會話數據的會話文件。看看這裏:

<?php 

session_save_path('./session/'); 

session_start(); 
$_SESSION['v'] = array('foo' => 123, 'bar' => 'spam'); 
$_SESSION['m'] = "rocky"; 

if(isset($_GET['delete']) == 'true') 
    session_destroy(); 

?> 

我有一個腳本whitch創建一個會話和v值設置爲10,並在一個名爲./session文件夾中的同一個腳本路徑保存會話數據。

現在打開頁面,然後瀏覽./session目錄,您應該看到一個名稱類似於sess_4r7ldo7s5hsctu3fgtvfmf4sd0的文件。這是存儲會話數據是在哪裏,它會包含:

v|a:2:{s:3:"foo";i:123;s:3:"bar";s:4:"spam";}m|s:5:"rocky"; 

通過傳遞?delete=true頁面激活session_destroy(),會議文件將被刪除簡單。