【问题标题】:How to send user-specific data between PHP and Node with MemCache or Redis如何使用 MemCache 或 Redis 在 PHP 和 Node 之间发送用户特定的数据
【发布时间】:2017-05-01 12:13:07
【问题描述】:

我现在知道 MemCache 不能按我最初的预期工作,但我仍然无法在 PHP 和 Node 之间传输特定于用户的数据(例如登录成员的 id)。

到目前为止,我只安装了 Memcache,但如果我需要的话,我也可以安装 Redis,但是我需要一些方法来根据 Node 和 Apache 上的会话或 cookie 数据来识别每个登录的用户( PHP) 服务器在他们登录时。

我宁愿不使用用于引用数据库的通用会话 ID,但如果必须,我会这样做。

这就是我在 PHP 中的存储方式

$memcache = new Memcache;
$memcache->connect('localhost',11211);
$uData = json_encode($_SESSION);
$memcache->set('Session',$uData);

这是我最初的 Node 文件,由于我误解了 Memcache 的功能,显然必须对其进行重大更改。

/*****************************************
 * 1. Configuration
 * 2. Declarations & Definitions
 * 3. Memcache & Session Vars
 * 4. Server Initiation
 * 5. Client Connections
 *  5-1. On Client Connect
 * 6. Helper Functions
 * 7. Utility Functions
 *****************************************/


/*****************************************
 * 1. Configuration
 *****************************************/
// Basic config options
var NodePortNumber = 1337; // t3h 13370rz
var MemCachePortNumber = 11211; // default MemCache port is 11211
var MySQLParams = {
    'Host': 'localhost',
    'User': 'user',
    'Pass': 'pass',
    'DB': 'database'
};


/*****************************************
 * 2. Declarations & Definitions
 *****************************************/

var Express = require('express')();
var HTTP = require('http').Server(Express);
var IO = require('socket.io')(HTTP);

var MySQL      = require('mysql');
var Database = MySQL.createConnection({
    host     : MySQLParams.Host,
    user     : MySQLParams.User,
    password : MySQLParams.Pass,
    database : MySQLParams.DB
});



/*****************************************
 * 3. Memcache & Session Vars
 *****************************************/

var MemCache, Session;

// Define a default value for all Session values so undefined warnings aren't thrown for non-members
Session = [];
Session['MemberID'] = 0;
Session['MemberEmail'] = undefined;
Session['MemberPass'] = undefined;

// Get session vars from Memcache
var Memcached = require('memcached');
MemCache = new Memcached('127.0.0.1:'+MemCachePortNumber); // connect to local memcached
MemCache.get('Session', function(err,result){
    Session = JSON.parse(result);
});


/*****************************************
 * 4. Server Initiation
 *****************************************/
// Initiate the Node server
HTTP.listen(NodePortNumber, function(){
    console.log('Server created. Socket listening on Port '+NodePortNumber);
});


/*****************************************
 * 5. Client Connections
 *****************************************/

var LiveClientCounter = 0; var Members = {};
var IsMember = false;

// Event fired every time a new client connects:
IO.sockets.on('connection', function (client) {
    /*****************************************
     * 5-1. On Client Connect
     *****************************************/
    var clientID = client.id;
    LiveClientCounter++;
    IO.emit('connection count', LiveClientCounter);
    console.log('Member '+Session['MemberID'] +' connected');
    if ( typeof Session['MemberID'] != typeof undefined && Session['MemberID'] > 0 ) {
        IsMember = true;
        if ( typeof Members[Session['MemberID']] == typeof undefined )
            Members[Session['MemberID']] = [];

        Members[Session['MemberID']][clientID] = {
            SocketOBJ: client,
            ClientID: clientID,
            MemberID: Session['MemberID']
        };

        console.log('Key added for Member #'+Session['MemberID']);
    }

});

【问题讨论】:

    标签: php node.js redis memcached


    【解决方案1】:

    你不能这样做

    $memcache = new Memcache;
    $memcache->connect('localhost',11211);
    $uData = json_encode($_SESSION);
    $memcache->set('Session',$uData);
    

    每个用户都会覆盖会话密钥。

    你可以做类似的事情

    $memcache = new Memcache;
    $memcache->connect('localhost',11211);
    $_SESSION['id'] = 'Session_' . phpsessionid();
    $uData = json_encode($_SESSION);
    $memcache->set($_SESSION['id'], $uData);
    

    然后找到一种方法让节点进程知道 $_SESSION['id']

    【讨论】:

    • 您能否添加一个如何传输此数据的示例?我在想一个 GET 变量,但似乎会有更好的方法。
    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 2015-07-11
    • 2016-05-22
    • 2016-01-12
    • 2016-04-11
    • 2020-02-26
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多