PHP 与 NodeJS 如何共用 Session?

没有问题描述,也不知道你都尝试过哪些方法,只能假设你的场景是“node如何读取php session”,这应该是最常见的情况。

PHP暴露一个Service,向Node提供Session数据
php_session.php?SID=xxxx


  function getSessionByID($SID) {
    if (session_id()) {
      // 关闭当前session
      session_destroy();
    }
    // 初始化指定session
    session_id($SID);
    session_start();
    // 返回操作接口更友好的JSON
    // 必要的FLAG看这里 http://www.php.net/manual/en/json.constants.php
    return json_encode($_SESSION);
  }

  header('Content-Type:application/json');
  echo getSessionByID($_GET['SID']); 
?>

node

var request = require('request');
request('http://localhost/php_session.php?SID=xxxx', function(err, res, body) {
  if (!err && res.statusCode == 200) {
    // 根据需要使用body(json)
  }
});

这是我个人最推荐的方式,好处是实现非常简单,也很好维护,出发点是PHP的执行环境是操作PHP session的最可靠环境;这样一来session serialize和unserialize的细节node不需要关心,node和php打交道而不是和php session的“实现”打交道;可能的“坏处”是通过HTTP round trip发送json payload有一定的性能损失, 但是这个“坏处”是不是成为一个问题,只有你自己才能衡量 。当然调用方式不一定是node去请求php所提供的http接口,也可以用类似的实现让php向node POST数据,但思路是一样的,就是通过HTTP发送JSON payload。

另一种方法是在php里实现自己的session handler,PHP: session_set_save_handler,然后实现一个类似这样的write方法;  实现细节可以参考@大石头 Dion发的链接。

实现相对复杂,不十分推荐的原因是一个PHP的外部需求(node需要共享php的session)不应该通过改变PHP内部实现(自己的session handler)来达成,引入这种复杂度很多时候都不值得;另一个原因是有时候这需要嵌入当前系统的执行逻辑,会成为一个hack;推荐的原因是性能,因为node会和PHP的session存储(比如memcache)直接打交道。

核弹级的解决方案是用javascript写一个decoder,输入php serialize(不是serialize())好的session数据,输出是一个javascript object。

比如
输入
name|s:3:"Tom";age|i:7
输出
{name: "Tom", age: 7}
写这个decoder,不像看起来那么简单。

如果你需要在Node里面修改PHP的session数据,那么下面的问题需要考虑
  1. 是否绝对必要这样做
  2. 如果是,能否不使用PHP的session
  3. 如果是,你就很可能需要自己实现session handler,详见 PHP: session_set_save_handler
这个实现里关键的问题是你不宜使用序列化后整村争取session的方式,比如文件和memcache,比较合适的是使用一个noSQL数据库来存储,这样,session内的每个字段才可以被单独操作而不影响其余字段;但无论如何,请先考虑 问题1和2。

你可能感兴趣的:(IT学习交流)