2012-11-08 35 views
2

我想從頭開始創建一個會話處理器。我不想用session_set_save_handler。儘管我找不到任何東西,我只是不知道從哪裏開始。有人能指出我的方向是正確的嗎?還是解釋一下做這件事的最好方法?從頭開始處理會話

謝謝! :)

+0

取決於你想要的會話 –

+0

爲什麼不是session_set_save_handler? –

+0

@Bondye你是什麼意思?用戶,我可以使用它,但我想進入更高級的編程。這只是實踐。 – user18933

回答

1

有幾件事情試圖建立自己的會話機制時需要注意。

你可以做的第一件事就是編寫一個PHP會話包裝器。將包裝PHP會話功能的類。所以當你想使用會話時,你可以實例化你的會話類,並用會話做你想做的事情。你可以做這樣的事情:

class Session 
    { 
     /** 
     * Starts new or resumes existing session 
     * 
     * @access public 
     * @return bool 
     */ 

     public function start() 
     { 
      if(session_start()) { 
       return true; 
      } 
      return false; 
     } 

     /** 
     * End existing session, destroy, unset and delete session cookie 
     * 
     * @access public 
     * @return void 
     */ 

     public function end() 
     { 
      if($this->status != true) { 
       $this->start(); 
      } 

      session_destroy(); 
      session_unset(); 
      setcookie(session_name(), null, 0, "/"); 
     } 

     /** 
     * Set new session item 
     * 
     * @access public 
     * @param mixed 
     * @param mixed 
     * @return mixed 
     */ 

     public function set($key, $value) 
     {   
      return $_SESSION[$key] = $value; 
     } 

     /** 
     * Checks if session key is already set 
     * 
     * @access public 
     * @param mixed - session key 
     * @return bool 
     */ 

     public function has($key) 
     { 
      if(isset($_SESSION[$key])) { 
       return true; 
      } 

      return false; 
     } 

     /** 
     * Get session item 
     * 
     * @access public 
     * @param mixed 
     * @return mixed 
     */ 

     public function get($key) 
     { 
      if(!isset($_SESSION[$key])) { 
       return false; 
      } 

      return $_SESSION[$key];   
     } 
    } 

然後你就可以使用這個會話類是這樣的:

$session = new Session(); 
$session->start(); 
$session->set('id', 5); 
echo $session->get('id); 

我喜歡這個,因爲我可以使用PHP的會話狀物品和沒有使用PHP功能。 但請注意,您無論如何都使用PHP函數,您在使用這個類時就不會看到它。這樣做可以幫助您深入瞭解PHP會話的工作方式。

如果您決定咬定子彈並編寫自己的會話機制,則有幾件事情需要注意。你需要決定的第一件事是你會在哪裏存儲會話信息? 您可以將它們保存在數據庫,文件系統,cookie等文件中...... 默認情況下,PHP將會話保存在文件系統上。編寫自己的會話機制的最簡單方法是將會話保存到cookie中。 Codeigniter默認使用Codeigniter會話。

你會寫你自己的對象,這將有方法讓你讀,寫,編輯,刪除...會議陣列。該數組必須在保存到cookie之前序列化。一旦會話被保存在cookie中,您可以使用您編寫的方法將它們取出,編輯或刪除它們等。這樣做時,請注意安全性,因爲用戶可以查看其Cookie。你將不得不隱藏會話值。

然後,如果您決定將會話保存到數據庫中,則可以使用您擁有的相同方法,但這次將會話保存到數據庫中而不是cookie中。

最好的方法是編寫會話接口,以便每個會話類都可以實現。這樣你可以使用你的Session類,並且不關心會話在哪裏存儲。

如果您不明白我現在在說什麼,那麼只需構建您自己的會話包裝器,這可以幫助您瞭解有關會話的更多信息。並給你用OOP處理會話的好方法。一旦你有了這些,你可以使用這個API來編寫你的會話接口,並在每個Session類中實現這個接口,並且編寫你自己的邏輯來保存會話數據的方式和位置。

還有一點,PHP Sessions機制沒有任何問題。

+0

完全是我在找的!非常感謝! – user18933

0

我做什麼時調用會話的

//啓動會話並設置變種的

在session_start();

$ _SESSION ['login'] ='yes';

$ _SESSION ['someinfo'] = $ var;

//當致電

session_start();

$ var = $ _SESSION ['someinfo'];

我希望這有助於

-kris

+0

這是基本的PHP。我不想使用程序會話,我想創建一個自定義處理程序。對困惑感到抱歉。 – user18933

0

如果您使用encrypted cookies,則不需要使用PHP的會話處理。基本上,標準會話將數據存儲在服務器上(memcache,文件或數據庫),並將數據的ID /密鑰放置在提供給用戶代理的cookie中。

加密的cookie只是將數據存儲在用戶代理的cookie中,並完全放棄該ID /密鑰。這可以減少服務器負載,因爲將存儲卸載給用戶。

如果數據的重要性不足以加密,您也可以只使用HMAC sign the cookie的內容,以防止人們看到原始內容而改變它。

你可能想試試我使用加密cookie的簡單PHP Kit庫。

$_SESSION = \Kit\Cookie::get('session'); 
...do stuff... 
\Kit\Cookie::set('session', $_SESSION); 

只要確保在發送任何輸出給用戶之前保存cookie,因爲所有標題都需要首先發送。