Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在php和节点之间共享会话_Node.js_Express_Redis_Session Cookies - Fatal编程技术网

Node.js 在php和节点之间共享会话

Node.js 在php和节点之间共享会话,node.js,express,redis,session-cookies,Node.js,Express,Redis,Session Cookies,最近是否有使用node、express和redis/predis共享PHPSESSID的指南(或示例代码) 我发现了一些1-2年前的教程,它们要么使用旧版本的express,要么不使用express Express cookie解析器也不推荐使用 如果有人能发布一些最新的代码,那就太好了 编辑-提取到目前为止的节点服务器代码: var express = require('express'), app = express(), server = require('http').createS

最近是否有使用node、express和redis/predis共享PHPSESSID的指南(或示例代码)

我发现了一些1-2年前的教程,它们要么使用旧版本的express,要么不使用express

Express cookie解析器也不推荐使用

如果有人能发布一些最新的代码,那就太好了

编辑-提取到目前为止的节点服务器代码:

var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server),
redis   = require('redis'),
client  = redis.createClient();    

var session = require('express-session'),
RedisStore = require('connect-redis')(session);

app.get('/', function(req, res) {
    res.sendfile('/');
});

app.use(
    session({
            name: 'PHPSESSID'
    store: new RedisStore({
        prefix: 'PHPSESSID',
        port: 6379
    })
})
);

io.sockets.on('connection', function (socket) {

    app.use(function(req, res, next) {
        console.log(req.session);
    });

    .......
套餐:

├─┬ connect@2.17.1
│ ├── basic-auth-connect@1.0.0
│ ├─┬ body-parser@1.2.0
│ │ └─┬ raw-body@1.1.4
│ │   └── bytes@0.3.0
│ ├── bytes@1.0.0
│ ├─┬ compression@1.0.2
│ │ ├── bytes@0.3.0
│ │ ├── compressible@1.0.1
│ │ └── negotiator@0.4.3
│ ├── connect-timeout@1.1.0
│ ├── cookie@0.1.2
│ ├── cookie-parser@1.1.0
│ ├── cookie-signature@1.0.3
│ ├─┬ csurf@1.2.0
│ │ ├── scmp@0.0.3
│ │ └── uid2@0.0.3
│ ├── debug@0.8.1
│ ├── errorhandler@1.0.1
│ ├─┬ express-session@1.2.0
│ │ ├── buffer-crc32@0.2.1
│ │ ├── uid2@0.0.3
│ │ └── utils-merge@1.0.0
│ ├── fresh@0.2.2
│ ├─┬ method-override@1.0.1
│ │ └── methods@1.0.0
│ ├── morgan@1.1.1
│ ├─┬ multiparty@2.2.0
│ │ ├─┬ readable-stream@1.1.13-1
│ │ │ ├── core-util-is@1.0.1
│ │ │ ├── inherits@2.0.1
│ │ │ ├── isarray@0.0.1
│ │ │ └── string_decoder@0.10.25-1
│ │ └── stream-counter@0.2.0
│ ├── on-headers@0.0.0
│ ├── parseurl@1.0.1
│ ├── pause@0.0.1
│ ├── qs@0.6.6
│ ├── response-time@1.0.0
│ ├── serve-favicon@2.0.0
│ ├─┬ serve-index@1.0.3
│ │ ├── batch@0.5.0
│ │ └── negotiator@0.4.3
│ ├─┬ serve-static@1.1.0
│ │ └─┬ send@0.3.0
│ │   ├── buffer-crc32@0.2.1
│ │   ├── debug@0.8.0
│ │   ├── mime@1.2.11
│ │   └── range-parser@1.0.0
│ ├─┬ type-is@1.2.0
│ │ └── mime@1.2.11
│ └── vhost@1.0.0
├─┬ connect-redis@2.0.0
│ └── debug@0.8.1
├─┬ express@4.1.1
│ ├─┬ accepts@1.0.1
│ │ ├── mime@1.2.11
│ │ └── negotiator@0.4.3
│ ├── buffer-crc32@0.2.1
│ ├── cookie@0.1.2
│ ├── cookie-signature@1.0.3
│ ├── debug@0.8.1
│ ├── escape-html@1.0.1
│ ├── fresh@0.2.2
│ ├── merge-descriptors@0.0.2
│ ├── methods@0.1.0
│ ├── parseurl@1.0.1
│ ├── path-to-regexp@0.1.2
│ ├── qs@0.6.6
│ ├── range-parser@1.0.0
│ ├─┬ send@0.3.0
│ │ ├── debug@0.8.0
│ │ └── mime@1.2.11
│ ├── serve-static@1.1.0
│ ├─┬ type-is@1.1.0
│ │ └── mime@1.2.11
│ └── utils-merge@1.0.0
├─┬ express-session@1.2.0
│ ├── buffer-crc32@0.2.1
│ ├── cookie@0.1.2
│ ├── cookie-signature@1.0.3
│ ├── debug@0.8.1
│ ├── on-headers@0.0.0
│ ├── uid2@0.0.3
│ └── utils-merge@1.0.0
├─┬ mysql@2.2.0
│ ├── bignumber.js@1.3.0
│ ├─┬ readable-stream@1.1.13-1
│ │ ├── core-util-is@1.0.1
│ │ ├── inherits@2.0.1
│ │ ├── isarray@0.0.1
│ │ └── string_decoder@0.10.25-1
│ └── require-all@0.0.8
├── redis@0.10.2
└─┬ socket.io@0.9.16
  ├── base64id@0.1.0
  ├── policyfile@0.0.4
  ├── redis@0.7.3
  └─┬ socket.io-client@0.9.16
    ├─┬ active-x-obfuscator@0.0.1
    │ └── zeparser@0.0.5
    ├── uglify-js@1.2.5
    ├─┬ ws@0.4.31
    │ ├── commander@0.6.1
    │ ├── nan@0.3.2
    │ ├── options@0.0.5
    │ └── tinycolor@0.0.1
    └── xmlhttprequest@1.4.2
对于节点(和Express 4.x):

从中的示例开始,但改用它作为会话存储

示例代码:

var express=require('express'),
app=express(),
cookieParser=require('cookie-parser'),
会话=需要(“快速会话”),
redistore=require('connect-redis')(会话);
app.use(express.static(uu dirname+/public));
应用程序使用(功能(请求、恢复、下一步){
如果(请求url.indexOf('favicon')>-1)
返回res.send(404);
next();
});
使用(cookieParser());
应用程序使用(会话)({
商店:新商店({
//这是redis会话php使用的默认前缀
前缀:“session:php:”
}),
//使用默认的PHP会话cookie名称
名称:“PHPSESSID”,
秘密:“node.js规则”
}));
应用程序使用(功能(请求、恢复、下一步){
req.session.nodejs='Hello from node.js!';
res.send(JSON.stringify(req.session,null');
});
app.listen(8080);
对于PHP:

使用redis会话处理程序,如

示例代码:



注意:确保使用相同的
前缀
(connect redis)/
redis_SESSION_前缀
(redis SESSION php)(connect redis使用'sess:'和redis SESSION php使用'SESSION:php:'默认情况下)和
ttl
(connect redis)/
SESSION.gc\u maxlifest
(php)(如果您使用的是redis数据库而不是默认数据库,则使用相同的数据库)用于redis session php和connect redis。

我只是想在此提供一个不需要redis的替代解决方案,我已经使用了几年(从另一个答案交叉发布):

这需要以下几点:

npm安装cookie

npm安装php取消序列化

此解决方案使用计算机上的会话文件-您不必更改此行

session.save\u handler=文件

^在php.ini文件中应该是这样的(默认)

下面是检索会话数据的超级简单代码:

var cookie = require('cookie');
var fs = require('fs');
var phpUnserialize = require('php-unserialize');

//This should point to your php session directory.
//My php.ini says session.save_path = "${US_ROOTF}/tmp"
var SESS_PATH = "C:/SomeDirectory/WhereYourPHPIs/tmp/";

io.on('connection', function(socket) {
    //I just check if cookies are a string - may be better method
    if(typeof socket.handshake.headers.cookie === "string") {
        var sid = cookie.parse(socket.handshake.headers.cookie);
        if(typeof sid.PHPSESSID === "undefined") {
          console.log("Undefined PHPSESSID");
        }
        else {
            console.log("PHP Session ID: " + sid.PHPSESSID);
            fs.readFile(SESS_PATH + "sess_" + sid.PHPSESSID, 'utf-8', function(err,data) {
                if(!err) {
                    console.log("Session Data:");
                    var sd = phpUnserialize.unserializeSession(data);
                    console.log(sd);
                }
                else {
                   console.log(err);
                }
            });
        }
    }
}
结果:


我的php代码库使用
PHPSESSID
作为会话密钥。因此我将
REDIS\u session\u前缀定义为
PHPSESSID
。是否正确?另外,我不确定如何访问节点文件中的会话值。我正在将代码添加到上面的原始问题中。不,前缀是特定于REDIS的选项。也就是说用于键的前缀。如果使用的是PHP的cookie名称(PHPSESSID),然后您需要在express会话选项中设置
name:'PHPSESSID'
。我似乎仍然无法访问会话。我想我可以安装express 3而不是4,但这似乎是一个倒退。我添加了示例代码,我已经亲自测试并验证了这些代码是否有效。只需访问您的PHP和节点脚本你的浏览器,你应该可以看到双方的会话数据。