没有问题描述,也不知道你都尝试过哪些方法,只能假设你的场景是“node如何读取php session”,这应该是最常见的情况。
PHP暴露一个Service,向Node提供Session数据
这是我个人最推荐的方式,好处是实现非常简单,也很好维护,出发点是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。
比如
写这个decoder,不像看起来那么简单。
如果你需要在Node里面修改PHP的session数据,那么下面的问题需要考虑
PHP暴露一个Service,向Node提供Session数据
php_session.php?SID=xxxx
<?php
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}
如果你需要在Node里面修改PHP的session数据,那么下面的问题需要考虑
- 是否绝对必要这样做
- 如果是,能否不使用PHP的session
- 如果是,你就很可能需要自己实现session handler,详见 PHP: session_set_save_handler