[REDIS] PHP와 노드 사이의 공유 세션
REDISPHP와 노드 사이의 공유 세션
노드 공유 PHPSESSID로 표현하고, 레디 스 / predis를 사용에 대한 최근 가이드 (또는 예제 코드)이 있습니까?
나는 1-2 살 몇 가지 자습서를 발견하고 그들은 모두 하나 이전 버전 표현 사용하거나 표현을 사용하고 있지 않습니다.
익스프레스 쿠키 파서도 사용되지 않습니다.
https://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/
NodeJS + + ExpressJS RedisStore 세션은 정의되지
사람이 좀 더 최근의 코드를 게시 할 수 있다면 그것은 좋은 것입니다 ...
편집 - 지금까지 노드 서버 코드의 추출 :
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
해결법
-
==============================
1.노드 (및 익스프레스 4.x의)의 경우 :
노드 (및 익스프레스 4.x의)의 경우 :
특급 세션에서 예제로 시작하지만, 대신 세션 저장소로 연결 - 레디 스를 사용합니다.
예제 코드 :
var express = require('express'), app = express(), cookieParser = require('cookie-parser'), session = require('express-session'), RedisStore = require('connect-redis')(session); app.use(express.static(__dirname + '/public')); app.use(function(req, res, next) { if (req.url.indexOf('favicon') > -1) return res.send(404); next(); }); app.use(cookieParser()); app.use(session({ store: new RedisStore({ // this is the default prefix used by redis-session-php prefix: 'session:php:' }), // use the default PHP session cookie name name: 'PHPSESSID', secret: 'node.js rules' })); app.use(function(req, res, next) { req.session.nodejs = 'Hello from node.js!'; res.send(JSON.stringify(req.session, null, ' ')); }); app.listen(8080);
PHP의 경우 :
레디 스 세션 - PHP와 같은 레디 스 세션 핸들러를 사용합니다.
예제 코드 :
<?php // from https://github.com/TheDeveloper/redis-session-php require('redis-session-php/redis-session.php'); RedisSession::start(); $_SESSION["php"] = "Hello from PHP"; // `cookie` is needed by express-session to store information // about the session cookie if (!isset($_SESSION["cookie"])) $_SESSION["cookie"] = array(); var_dump($_SESSION); ?>
참고 : 당신이 같은 접두사 (연결-레디 스)를 사용해야합니다 / REDIS_SESSION_PREFIX (레디 스 세션 - PHP는 () 'SESS :'사용을 연결 - 레디 스 및 사용-세션의 PHP 레디 스 기본적으로 '세션 : PHP를') 및 TTL (연결-레디 스) /session.gc_maxlifetime (PHP) (및 기본 이외의 레디 스 데이터베이스를 사용하는 경우 동일한 데이터베이스) 레디 스 세션 - PHP와 연결 - 레디 스 모두를.
-
==============================
2.난 그냥 레디 스를 필요로하지 않는다 여기에 대체 솔루션을 제공하고 싶어하고 나는 몇 년 동안 (다른 답변에서 교차 게시)를 사용하고있다 :
난 그냥 레디 스를 필요로하지 않는다 여기에 대체 솔루션을 제공하고 싶어하고 나는 몇 년 동안 (다른 답변에서 교차 게시)를 사용하고있다 :
이것은 다음을 요구한다 :
해발 쿠키 설치
NPM PHP-때 unserialize 설치
이 솔루션은 시스템에 세션 파일을 사용 -이 줄을 변경 할 필요가 없습니다.
session.save_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); } }); } } }
결과 :
socket.io/nodejs를 인증 사용자
from https://stackoverflow.com/questions/23795926/share-sessions-between-php-and-node by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스에 사용되는 기본 데이터 구조는 무엇입니까? (0) | 2019.12.30 |
---|---|
[REDIS] 레디 스 키 Jedis로 통지를 만료 (0) | 2019.12.30 |
[REDIS] 가장 효율적인 Node.js를 프로세스 간 통신 라이브러리 / 방법은 무엇입니까? (0) | 2019.12.30 |
[REDIS] 직접 메모리를 사용하여 대 레디 스 캐시 (0) | 2019.12.30 |
[REDIS] 키 이름 지정 규칙을 레디 스? (0) | 2019.12.30 |