2011-07-18 174 views
3

我在尋找如何在PHP中銷燬特定會話的見解。通過合作伙伴網站,用戶使用令牌登錄主網站並獲得完整會話。如何銷燬特定的PHP會話

也可以爲合作伙伴的網站調用destroy函數如果來自合作伙伴的網站用戶註銷。然後我們也應該註銷我們自己的用戶。

這是最好的方法是什麼? Zend_Session銷燬方法不接受參數,同樣PHP函數session_destroy既不。

我正在考慮兩個方案:

  1. 直接從文件/內存緩存中刪除會話信息,但希望比這個更「乾淨」的做法。

  2. 在如果這是一個「令牌」用戶每個頁面請求檢查;如果通過維護列表來檢查它們的令牌是否過期。這增加了繁忙網站的開銷,但可能是我唯一的選擇。

還是有沒有第三個/更好的方法,我沒有看到?

+0

可能重複的[使用會話ID取消設置會話](http://stackoverflow.com/questions/6703842/unset-a-specefic-session-using-session-id) – symcbean

回答

1

如果您希望能夠以「踢」用戶(S)的會議,你可以做到這一點是如果你使用MySQL(或一些其它數據庫,SQLite的偶數)爲您的會話存儲的唯一途徑。

然後,你可以簡單地從數據庫中刪除條目來殺死一個會話。

這也讓你做的做的事情,例如,「採取控制」特定用戶的會話和其他的東西:)

的看到這個通過一個非常基本的運行:http://www.devshed.com/c/a/MySQL/Custom-Session-Management-Using-PHP-and-MySQL/(不是最好的例子,但不夠好完整的例子來啓動你)。

編輯

另外,如果通過合作伙伴網站註銷,另一種方法我已經在過去的(這與O2和其他類似網站),他們分別獲得了「回調」使用(REST API調用在大多數情況下),當用戶退出他們的網站時他們也需要呼叫。

+0

有趣的想法 - 一個快速的Google然而,由於這是一個擁有許多併發用戶的繁忙網絡服務器(因此使用會話的memcache),因此提供了以下見解:「 有人認爲SQLite不適用於寫密集型環境,因爲它使用每次會話更新時,數據庫文件都會被鎖定,因此多次會話必須一次更新一次,而不是一次更新。另一個問題可能是損壞。如果單個基於SQLite的會話被損壞,所有會話會迷路。」 – Tramov

+1

個人我不會使用SQLite ...只是說明PHP可以使用它的多種方法。我已經使用MySQL進行會話管理很長一段時間了,從'簡單'cms系統到呼叫中心應用程序。 – Brian

+0

感謝您的鏈接,它是一個偉大的howto滾動自己的會話管理例程。 – Tramov

-2

的數據庫解決方案意味着會話數據庫需要mainwebsite和合作夥伴站點之間共享,這往往並非如此等等也許沿着這些瑣碎的東西線就足夠了?

<img src="mainwebsite/logout.php"> 

mainwebsite/logout.php:

<?php session_destroy(); ?> 
+0

他在問如何銷燬一個特定的會話,而不是當前用戶的會話。 – Brian

+0

正如我所看到的,他的問題的實質是在登錄合作伙伴網站時註銷主網站的當前登錄用戶。 –

+0

對不起,但你的答案仍然不能提供無縫的用戶體驗。我會收回我的投票壽 - 編輯你的答案,所以我可以這樣做:) – Brian

4

有沒有必要推出你自己的會話處理。

session_id()可以接受一個參數,您想要使用的會話ID。

所以,當你通過用戶關閉的合作伙伴站點,沿其SESSION_ID(或一些象徵性的,或其他)通過。

然後讓合作伙伴網站打一個這樣的腳本:

殺-用戶session.php文件

<?php 
/** 
* Destroy any active session identified by $_POST['sid'] 
*/ 
session_id($_POST['sid']); 
session_start(); //this line may not even be necessary 
session_destroy(); //destroys that session. 

因此,當用戶註銷的合作網站,合作伙伴網站職位session_id(你給他們)到你的kill-user-session腳本,並且用戶的會話在你的服務器上被銷燬。

當然,您可能想通過某種方法限制對kill-user-session.php的訪問。

+0

有時候,最好的答案不是被接受的答案。這是最好的答案。 – Peter