2014-06-10 35 views
3

關閉會話有沒有一種方法來關閉PHP會話沒有編寫或摧毀它?我缺少的東西還是有隻有兩個功能(session_write_close()session_destroy())的重置session_status()PHP_SESSION_NONE?換句話說,如果我有一個開放會話,我可以簡單地關閉它而不影響外部會話數據,因此可以重新加載它。無需編寫或摧毀它

+0

有沒有必要那樣做。如果您不希望會話「啓用」 - 只是不要使用它。 – DanFromGermany

+2

謝謝你的邏輯思維的騎士。如果我不想一開始就使用它,那麼我很難進入問這個階段。 –

回答

2

幾個月後拋出一個issue後的兩種新方法現在在PHP 5.6可用,但文檔只與5.6.2一起抵達。

  • session_abort() - 放棄會話數組更改並完成會話,請參閱docs
  • session_reset() - 重新初始化與原始值會話陣列,參見docs
3

您可以通過$_SESSION = null做到這一點。會話不可用,但數據仍然存在(不會被刪除)。

考慮你在會議上有數據:

<?php 
session_start(); 
session_regenerate_id(); // get a fresh id 
echo session_id(); 

$_SESSION['test'] = '12345'; 

print_r($_SESSION); // echoes the data in the session 

數據:test|s:5:"12345";

然後在下一個請求:

<?php 
session_start(); 
echo session_id() . "<br>"; // echoes the same id as of the last request 

$_SESSION = null; 

print_r($_SESSION); // echoes nothing 

echo "<br>"; 

echo session_status(); // echoes 2 (PHP_SESSION_ACTIVE) 

數據仍然是相同的:test|s:5:"12345";

php-fpm 5.4.29, most recent nginx, memcached as session handler)。

孔的數據仍然可以通過$_SESSION['whatever'] = ...寫,但沒有看過。我不確定這是否是一個好的解決方案,但我不得不承認,我仍然不明白爲什麼或者你需要什麼。

作爲替代方案,你可以實現會話的包裝類與屬性$this->active = true; // or false

class MySessionWrapper { 
    protected $active; 
    protected $data; 
    // getter setter for $this->active and $this->data ... 

    public function getData($var) { 
     if ($this->active !== true) { 
      throw new Exception('session disabled'); 
     } 
    } 
} 
+0

感謝您的關注。第一部分不是真正的解決方案 - session_status保持活動狀態。第二種解決方案就是我目前擁有的解決方案,但這種解決方案意味着重新發明車輪。我需要一個測試套件,我需要在運行隔離的php命令後重新加載當前會話數據,這個命令通常會修改它。有幾種解決方法,但它們都很笨拙,並且在使用本地會話功能時通常會導致不良結果。 –

+0

@IanBytchek好吧,我現在瞭解你的情況。不幸的是我不能想象一個更好的解決方案。祝你好運:) – DanFromGermany

+0

欣賞你的輸入:) –