我们可能会用Java EE应用程序替换PHP应用程序,但问题是我们要逐个替换模块,这意味着两个应用程序将共存并相互通信。
那么可以在两个应用之间共享用户会话吗?或者使用cookie来解决问题?
答案 0 :(得分:4)
使用PHP-java-bridge可以非常高效,快速地与PHP共享常规Java EE会话。
此解决方案提供优于使用数据库的性能,因为它不会生成任何磁盘IO。它也不需要对PHP Web服务器或Java EE服务器进行任何更改。只需添加一些代码,配置就可以了。
设置php-java-bridge可能令人困惑,但如果你知道怎么做,那只是一个10分钟的工作。正如我刚才做了一个概念验证,我可以向你提供食谱解决方案:
Download PHP-java-bridge个文件。我下载了JavaBridgeTemplate610.zip(用于所需的jar文件)和php-java-bridge_6.1.0_documentation.zip以获取所需的示例,php包含文件和示例代码(会话共享!)。
将“JavaBridge.jar”,“php-script.jar”和“php-servlet.jar”添加到webapp中,方法是将它放在你的“/ WEB-INF / lib /”中是Java EE服务器。
在您的Java EE服务器“/ web”目录中添加“test.jsp”:
<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>
配置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>
将一个名为“test.php”的文件添加到您的webserver根目录中,并确保编辑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>
安装所需的“java.inc”php include文件。您可以在src.zip中下载的“php-java-bridge_6.1.0_documentation.zip”中找到该文件。复制“/ java”目录中的“java.inc”文件(只需这个php文件!)。
重新启动应用程序服务器
启动test.php脚本(例如goto:http://127.0.0.1/test.php)
如果单击指向jsp和php文件的链接,您会注意到计数器共享JSP和PHP脚本之间的Java会话!
为了在JSP / Servlet和PHP中共享相同的JSession cookie,它们都需要在相同的域名上运行(同时确保JAVA_HOSTS是PHP文件使用相同的域名!)。 /强>
答案 1 :(得分:2)
您可能希望查看的一个选项是Quercus,它与Resin绑定,允许您在Java EE应用服务器上运行PHP代码,并在两个平台之间进行一些通信。
答案 2 :(得分:1)
使用session_set_save_handler()将会话数据保存到数据库。
<强>更新强> 效率方面,它是非常小的,与读取文本文件到查询数据库(可能使用现有连接)的区别。
一些示例代码(从我使用的内容中简化)
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;
来读取/写入会话数据。