2010-04-11 39 views

回答

1

將會話數據保存到數據庫session_set_save_handler()

UPDATE 效率明智的,將(可能使用現有的連接)是極小子挺,閱讀文本文件查詢數據庫的差異。

一些示例代碼(從我使用簡體)

class Session { 
    public function __construct() { 
     session_start();  
     $this->clean();   
    } 
    public function __destruct() { 
     session_write_close(); 
    } 
    public function open() { 
     return TRUE; 
    }  
    public function close() { 
     return TRUE; 
    }  
    public function read($id) { 
     global $Database; 
     if ($Database->select('session_data FROM sessions WHERE session_id="%s"', $id)) { 
      list($data) = $Database->fetch(MYSQL_NUM); 
      return $data; 
     } else { 
      return ''; 
     } 
    }  
    public function write($id, $data) { 
     global $Database; 
     return $Database->replace('sessions SET session_id="%s", session_data="%s", session_updated=%d', array($id, $data, time())); 
    }  
    public function destroy($id) { 
     global $Database; 
     $_SESSION = array(); 
     return $db->delete('sessions WHERE session_id="%s"', $id); 
    }  
    public function clean($expire = 600) { 
     global $Database; 
     $Database->delete('FROM sessions WHERE session_updated<%d', $time - $expire); 
     return TRUE; 
    } 
} 
// Declare the functions to use: 
session_set_save_handler(array('Session', 'open'), array('Session', 'close'), array('Session', 'read'), array('Session', 'write'), array('Session', 'destroy'), array('Session', 'clean')); 
$Session = new Session; 

的,你可以讀/寫在通常的技術使用$_SESSION['name'] = data;會話數據。

+0

這會損失效率嗎?性能優良的最佳方式是什麼?內存緩存? – 2010-04-11 02:10:51

+0

雖然這是一個好主意,但請注意,您將無法使用JEE的本地會話處理,您需要在此機制之上實施您自己的會話處理。但是,許多容器都有可專門插入的會話管理器,您可以在其上編寫這些管理器。 – 2010-04-11 02:44:23

+1

如何解析Java中的PHP編碼會話數據? – rustyx 2012-01-21 14:55:59

2

您可能想要查看的一個選項是Quercus,它綁定到Resin中,並允許您在Java EE應用服務器上運行PHP代碼,並啓用兩個平臺之間的某些通信。

+0

這也很棒! – 2010-04-11 03:07:45

+0

是的,我不會推薦類似上述內容的主要原因是它迫使您手動推出自己的會話管理,這是兩種平臺(尤其是Java)提供的功能。特別是在Java的情況下,本地會話管理可以爲您購買持久性,複製和一些好吃的東西,本質上是免費的,通過採取這種方法就會失敗。 – jayshao 2010-04-11 19:09:17

+0

我認爲Quercus還提供了PHP和Java EE之間的Session集成。這個解決方案的問題是你得到了一個全新的PHP平臺,這意味着並不是所有的PHP擴展都能在這個平臺上工作或工作。 – Kdeveloper 2010-04-11 19:25:25

4

與PHP共享常規的Java EE會話可以通過PHP-java-bridge以非常高效和快速的方式完成。

該解決方案比使用數據庫提供更高的性能,因爲它不會生成任何磁盤IO。它也不需要對PHP webserver或Java EE服務器進行任何更改。只需添加一些代碼,配置即可完成。

建立php-java-bridge可能會讓人困惑,但如果你知道如何去做,那只是一個10分鐘的工作。正如我剛纔做了概念我自己的證明,我可以交給你的食譜解決方案:

  1. Download PHP-java-bridge文件。我下載了需要的示例JavaBridgeTemplate610.zip(用於所需的jar文件)和php-java-bridge_6.1.0_documentation.zip,php包含文件和示例代碼(會話共享!)。

  2. 將「JavaBridge.jar」,「php-script.jar」和「php-servlet.jar」添加到你的webapp中,並放入你的「/ WEB-INF/lib /重新Java EE服務器。

  3. 添加 「test.jsp的」 給你的Java EE服務器 「/網絡」 目錄:

    <HTML> 
    <TITLE>PHP and JSP session sharing</title> 
    <BODY> 
    <% 
    
    javax.servlet.http.HttpSession $session = request.getSession(); 
    if($session.getAttribute("counter")==null) { 
        $session.setAttribute("counter", new java.lang.Integer(1)); 
    } 
    
    int $counter = ((java.lang.Integer)$session.getAttribute("counter")).intValue(); 
    out.println ("HttpSession variable \"counter\": " + $counter + "<br>"); 
    java.lang.Integer $next = new java.lang.Integer($counter+1); 
    session.setAttribute("counter", $next); 
    %> 
    <a href="http://127.0.0.1/test.php">PHP page</a> 
    </BODY> 
    </HTML> 
    
  4. 配置爲JavaBridge的servlet,因此它可以通過PHP來傳達到Java EE服務器。只需添加以下行你的web.xml:

    <servlet> 
        <servlet-name>PhpJavaServlet</servlet-name> 
        <servlet-class>php.java.servlet.PhpJavaServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>PhpJavaServlet</servlet-name> 
        <url-pattern>*.phpjavabridge</url-pattern> 
    </servlet-mapping> 
    
  5. 添加一個名爲「test.php的」文件到你的Web服務器根目錄,並確保您編輯JAVA_HOSTS和JAVA_SERVLET正確指向在web.xml中配置Javabridgeservlet。

    <?php 
    define ("JAVA_HOSTS", "127.0.0.1:8084"); 
    define ("JAVA_SERVLET", "/JavaBridge.phpjavabridge"); 
    
    require_once("java/Java.inc"); 
    $session = java_session(); 
    ?> 
    
    <HTML> 
    <TITLE>PHP and JSP session sharing</title> 
    <BODY> 
    <?php 
    if(is_null(java_values($session->get("counter")))) { 
        $session->put("counter", 1); 
    } 
    $counter = java_values($session->get("counter")); 
    print "HttpSession variable \"counter\": $counter<br>\n"; 
    $session->put("counter", $counter+1); 
    ?> 
    <a href="http://127.0.0.1:8084/test.jsp">JSP page</a> 
    </BODY> 
    </HTML> 
    
  6. 安裝需要的「java.inc」php include文件。您可以在src.zip下載的「php-java-bridge_6.1.0_documentation.zip」中找到該文件。複製「java。INC」文件中的 「/ java的」 目錄(僅這一個PHP文件!)

  7. 重新啓動應用程序服務器

  8. 啓動test.php的腳本(例如轉到:http://127.0.0.1/test.php)。

如果你點擊鏈接到JSP和PHP文件回來,你會發現,櫃檯股

爲了共享相同的JSession餅乾我JSP和PHP腳本的Java會話!在JSP/Servlet和PHP中,它們都需要在相同的域名上運行(還要確保JAVA_HOSTS是PHP文件使用相同的域名!)。

相關問題