PHP与NodeJS如何共用Session?
时间:2021-07-01 10:21:17
帮助过:20人阅读
回复内容:
没有问题描述,也不知道你都尝试过哪些方法,只能假设你的场景是“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.com/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)
}
});
可以使用第三方的缓存工具,比如 memcached。
参考这篇文章:PHP and Node.JS session share using memcache
使用一个第三方存储如redis来保存session。
session还是放在服务器端操作比较好。
可以选择使用cookie,将cookie的生存时间expire设置为0代表随浏览器关闭失效。生存效果和session差不多,前端操作就方便很多了。
note.js运行在服务端的啊?和php并行运行的话可以考虑第三方共享session了,memcache,redis,数据库也可以。
建议是使用redis 或者memcached 做 session,这样不仅node和php程序可以共享session,也不会对php、node程序造成额外的开销。
如果是session放在node或者php程序的内存中,一来需要额外的代码和资源维护,二来这些代码往往不及redis等k-v数据库的解决方案成熟,反而(如果不合理的代码的话)是容易引起bug或者性能瓶颈的地方。比如上面有人提及的暴露php service的方法,或者是暴露node service,不说编写、维护代码需要人力开销,线上每秒请求处理能力一般是 php <~ node <
至于php, 我没了解过, 如果要支持多机, 水平扩展, 类似redis的方案还是需要的
这种方案缺点就是只能保存通用数据, 不能保存对象引用什么的.
说白了,什么叫共用?就是同一条数据,PHP能读,Node.js也能读。
至于怎么读就得看自己了,放数据库、Memcache、甚至你直接通过PHP留接口给Node.js(就像flamingtop提供的方法)。
session的目的是把数据存在服务器的内存里,如果清楚这点,那么找一个内存数据库(redis,memcached...)就能达到你的目的,如果你嫌这些都还太重量级,就随便用一个你熟悉的语言写一个轻量级的内存数据库就好,跨语言接口或者说是进程间通信推荐使用.sock文件。
推荐redis,php可以直接配置session方案,nodejs也有很多lib
一般的做法是使用session服务器,使用mysql或者memcache等成熟的方案都是可行的。