2013-03-31 53 views
3

我想知道的是,如果我可以共享多個客戶端的會話變量。 就像他們可以使用完全相同的對象一樣。下面的例子將說明我想要做什麼。我可以使用php會話在多個客戶端之間共享會話變量嗎?

客戶端1:

start_session(); 
include('somelcass.php'); 
//some code... 
$someobj = new someclass(); 
$_SESSION['myobject'] = serialize($someobj); 
$id = sha1("somephrase"); 
set_session_var_for_other_users_by_id('myobject', $id); 

客戶端2:

start_session(); 
include('somelcass.php'); 
$id = sha1("somephrase"); 
get_sessionvars_from_other_users($id); 
$someobj = unserialize($_SESSION['myobject']); 
//now use someobj from class someclass 

我的另一個問題是: 你使用像一些會議extention推薦:sessionPsql

+0

@Ihsan這個例子實際上應該說明這個想法;) – helle

回答

4

首先回答你的最後一個問題:

Session PgSQLDocs您鏈接是PostgreSQL會話保存處理程序。這是一個會話保存處理程序您可以配置使用,而不是默認的會話保存處理程序。默認session save handler in PHP正在將會話存儲到磁盤(files)。如果使用PostgreSQL的保存處理程序,會話將保存到PostgreSQL數據庫中(pgsql)。

如果您希望允許從多個Web服務器(擴展應用程序)訪問會話存儲庫,或者在您的情況下(可能)使用SQL查詢訪問所有會話,但在數據庫內保存會話可能有意義,但通常爲a tailored session save handler定義(可以基於PgSQL會話保存處理函數)。

要回答你的第一個問題,那麼:

是的,你可以這樣只要你有你涉及到的對象的引用,你知道如何訪問它做。這可以通過手動訪問會話存儲或通過自己共享會話並切換會話來訪問其他會話數據來完成。這取決於你的需要,在你的情況下,訪問序列化的數據可能更容易,這些數據由ID存儲在一些額外的表中,這些表與會話無關。如果不再需要數據,您應該考慮如何處理數據,例如在一段時間不活動後將其刪除。最後,你正在編寫你自己的會話實現,這是可行的。版本4之前的PHP沒有開箱即用的會話支持,而且它現在的會話支持非常輕便,所以如果您需要執行更多特定的內容(例如,您需要執行的操作),則通常會自行編寫。

所以多個客戶端可以使用同一個會話(共享會話),這實際上是還有一種方式來攻擊web應用(session hijackingAttack),但只要在「劫持」是指您的應用程序數據流裏面,我不看到任何技術上的錯誤。在PHP中,這意味着您需要關閉當前會話,打開另一個會話(會話由名稱 ID標識),讀取該值,關閉另一個會話並重新打開當前會話。它在技術上可以在PHP中工作,但是當你這樣做時會寫出可靠的代碼,因爲會話問題很難調試。

這也是在多個客戶端之間編寫自己的對象共享機制而不是重新使用PHP's session featureDocs的好理由。

3

多個客戶端無法共享數據在會話對象中。如果你想在客戶端之間共享數據,你通常會使用一些其他的服務器端存儲方式,例如數據庫。

2

我寫了一個解決方案,PHP應用解決主要是兩種類型的問題:

  • 如何共享數據/ PHP程序之間的變量,在相同/型動物服務器
  • 託管如何同步在數據讀/寫操作/變量

我的項目是在GitHub上ANYEM Project

託管210

第一:使用命令行啓動ANYEM_SERVER現在

php ANYEM/ANYEM_SERVER/anyem.app.server.impl/ServerImpl.php 

,在你的PHP應用程序,你可以做如下:

<?php 
// load server's connection configuration (ANYEM_SERVER IP and Port Number ...) 
$clientConnection = ClientConnectionImpl::newClient(); 
// build a key for your variable that will be stored in server 
// the key is composed on 3 Parts : [1] => URL, [2] => Variable Namespace, [3] => Variable Name 
$identifier   = new ResourceIdentifierImpl("anyem.com", "anyemNameSpace", "a"); 

$a = 5; 
$anyemClient   = new AnyemClientImpl($clientConnection, $identifier); 
try { 
    // if $a is reserved by another PHP Process, so this process 
    // will sleep (1/10) seconds and retry the reservation of the resource 
    // here, the max number of reservation attempts is 5, if reservation 
    // fails, an Exception will be thrown 
    $responseWrapper = $anyemClient->get($a, 5, 100000); 
    // here we have reserved the variable $a, and we have the unserialized contents 
    $a = $responseWrapper->getResource()->getData(); 
    // here, we update the contents, send it to ANYEM_SERVER and releasing the lock (we unreserve it) 
    $anyemClient->put(++$a); 
} 
catch (Exception $e) { 
    print $e->getMessage() . "\n"; 
    continue; 
} 

希望可以幫助別人:)

0

我認爲這個問題的最佳解決方案是使用數據庫。創建一個表並存儲在其中。當你需要從表格讀取數據時。它是在會話之間共享數據的快速而簡單的解決方案。

+0

這並沒有提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/18557474) –

+0

你能否提供一些關於如何實現這一點的更多細節?因爲它是你的答案似乎只是總結[本答案](https://stackoverflow.com/a/15728813/3744182)和[這一個]中給出的建議(https://stackoverflow.com/a/15727638/3744182 )。 – dbc