php读取memcahed java session

PHP 共享 JAVA 保存的session信息

情景:

1:现在有两个系统,一个是Java做的系统,一个是PHP的系统,现在要把两个系统弄成一个单点登录。

2:两个系统两个库,两个库的表结构完全不同,现在要解决的就是session共享问题和用户信息的同步。

方法:::

1:java系统为主系统,php那边的登录,退出,注册都跳到java那边系统去登录。

2:java系统那边可以创建一个“session表“存的是每个用户对应session信息。php那边就要根据用户ID去‘session表’,存在取出相关信息,做登录。因为要维护两个库,所以php那边要查询自己库中是否存在这个用户,不存在需要添加。(没用这种方式,需要维护session的生命周期太麻烦)

3 **:创建”一个sesison表“对两边的系统都要付出比较大的代价,而且每次都要查数据库,session有效期维护那边程序也很复杂。所以借组于“memcache",tomat 于memcache整合(http://bbhaiidreamer.blog.51cto.com/3398980/841814)。这样的话,session信息就交memcache管理了。(项目采用这种方法)。

4:JAVA 与 PHP 是一、二级域名,可以实现cookie共享。这样在php那边通过得到session_id 到memcache里面去取用户的信息。由于java跟php的memcache存的格式不一样。java存的时xml格式的,所以php还要做一些处理,通过session_id,取到对应的xml,再解析xml里面的内容。完后再做登录操作。存在,直接登录,不存在,入库再登录操作。

java代码不用做什么处理,php这边的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

functionqa_get_logged_in_user(){

// Until you edit this function, nobody is ever logged in

// echo "<script>alert('get_logged_in_user');</script>";

//从cookie里面取JSESSIONID,如果存在,取出session值

if($_COOKIE['JSESSIONID']){

//echo "<script>alert('COOKIE hava' );</script>";

$session_id=$_COOKIE['JSESSIONID'];

}else{

echo"<script>alert('COOKIE null ');</script>";

}

//连接memcachd,从memcache取用户信息

$memcache=newMemcache;

$memcache->connect('192.168.252.*', 11211)ordie("Could not connect");

$var=$memcache->get($session_id);

//解析从memcached取出来的xml,取到用户相关属性

$xml_parser=newPageXml();

$date_xml=$xml_parser->del_xml($var);

if(empty($date_xml)){//

returnnull;

}else{

$results=array($devName,$contact,$email,$regTime,$devId);

$devName=$date_xml[0];

$contant=$date_xml[1];

$email=$date_xml[2];

$regTime=$date_xml[3];

$devId=$date_xml[4];

// get in session or cookie.

$qa_db_connection=qa_db_connection();

$sql="SELECT userid,email,handle FROM t_users WHERE email='$email'";

$result=mysql_fetch_assoc(mysql_query($sql,$qa_db_connection));

//echo "<script>alert('get_logged_in_user-select user = $result');</script>";

if(is_array($result)){

returnarray(

'userid'=>$result['userid'],

'publicusername'=>$result['handle'],

'email'=>$result['email'],

'level'=> ($devName=='admin') ? 1: 0

);

}else{

$insert_result= mysql_query("INSERT INTO t_users (created, createip, email, passsalt, passcheck, level, handle, loggedin, loginip,flags) ".

"VALUES (NOW(), 0, '$email', '' , '',0, '$contant', NOW(),0,1)",$qa_db_connection);

$d_id= mysql_insert_id();//返回插入的userId

//echo "<script>alert('get_logged_in_user-insert user = $insert_result,user);</script>";

returnarray('userid'=>$d_id,

'publicusername'=>$contant,

'email'=>$email,

'level'=> ($devName=='admin') ? 1: 0);

}

}

}

/*

* 解析xml类 2012-11-13

*/

classPageXml {

functiondel_xml($var) {

// echo $var;

$first=strpos($var,"xml");//字符第一次出现的位置

//echo "fist = ".$first."<br>";

$last=strrpos($var,">");//字符最后一次出现的位置

// echo "last = ".$last;

$resultXml=substr($var,$first-2,$last);//截取字符串,形式如:substr($string,0,-3);

$dom=newDOMDocument('1.0');

$dom->loadXML($resultXml);

//获取具体的节点

$messages=$dom->getElementsByTagName('v');

foreach($messagesas$book)

{

$x_class=$book->getAttribute('class');

if($x_class=='com.kkpush.account.domain.Developer'){

$devName=$book->getAttribute('devName');

$contact=$book->getAttribute('contact');

$email=$book-> getAttribute('email');

$regTime=$book-> getAttribute('regTime');

$devId=$book-> getAttribute('devId');

$results=array($devName,$contact,$email,$regTime,$devId);

return$results;

}

}

returnnull;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Memcache取出来的xml内容如下:

3K:�x�<:�{H01:�{Hb#C9437013AB69ED7F06BF3E634E78AC27-n1<?xmlversion="1.0"encoding="UTF-8"?>

<attributesclass="java.util.concurrent.ConcurrentHashMap"__id="0"

size="3">

<kclass="java.lang.String"__id="1"value="userName"/>

<vclass="java.lang.String"__id="2"value="kktalk"/>

<kclass="java.lang.String"__id="3"value="user"/>

<!-- 这里就是用户的信息,只要解析这个就好了 -->

<vclass="com.youar.account.domain.Developer"__id="4"devId="91"

devName="youa"contact="youra"password="youa"

email=""QQ="9999999"regTime="2012-11-13 09:56:22.0"

lastUpdateTime="2012-11-13 09:56:19.0"isEnabled="0"isActivation="0"

activationCode="fab9ef6e-9e2c-43e1-8ab5-1fb473a9aeed"

isCustomDiscount="0"clickRate="0.0"showRate="0.0"

tempPasswordTime="2012-01-01 20:20:20.0"companyName="ktlak"/>

<kclass="java.lang.String"__id="5"value="randCheckCode"/>

<vclass="java.lang.String"__id="6"value="7386"/>

</attributes>

ps: 由于php系统比较特殊,用户表中只需要维护几个关键字段而已。在这里讲的是正对于我目前的系统,只供参考,具体问题具体分析。如有说错的地方,望指正。