PHP,nodeJS和会话

魔力士

我有一个经典的Apache服务器来提供php文件,还有一个nodeJS服务器(带有socket.io,但没有快速连接),用于该PHP网站上的实时事件管理。有时我需要对连接到nodeJS服务器的客户端进行身份验证,但是当用户重新加载页面时,此身份验证会丢失,因为它还会重新加载socket.io客户端(我将套接字ID存储在服务器上,每次刷新时都会丢失该ID。 )
问题是:有没有办法让socket.io中的连接保持活动状态,还是链接apache PHP会话和nodeJS服务器的方法?还是一种使用cookie保持身份验证的方法(知道我必须存储敏感数据,例如用户密码和密钥)?

栗子

您可以memcached在PHP中用作会话存储处理程序Memcached是一个简单的键值存储,可以通过TCP进行访问;有一个可用于Node.jsmemcached模块

PHP通过使用会话ID作为键将会话存储在memcached中。存储在memcached中的会话数据(值)是一个序列化的PHP对象,略有不同您可以在SO问题“使用Javascript解析PHP会话”中阅读有关此异常序列化的更多信息幸运的是,已经有一个NPM模块:php-unserialize


现在介绍操作方法。

假设条件

  • memcached可在127.0.0.1:11211访问
  • php.ini(或php.d / memcache.ini)配置为:session.save_handler='memcached'session.save_path='tcp://127.0.0.1:11211'
  • 您已经安装了所需的NPM模块(2): npm install memcached php-unserialize
  • 您对CLI没事

准备

首先,仅需获取一些测试数据即可,请保存以下php脚本(s.php):

<?php
session_start();
$_SESSION['some'] = 'thing';
echo session_id()."\n";
print_r($_SESSION);

使用执行php s.php,它将把东西放到stdout中:

74ibpvem1no6ssros60om3mlo5
Array
(
    [some] => thing
)

好的,现在我们知道了会话ID(74ibpvem1no6ssros60om3mlo5),并确认已设置了会话数据。为了确认它是否在memcached中,您可以运行memcached-tool 127.0.0.1:11211 dump该程序以提供已知key:value对的转储,例如,我的测试床中有两个:

Dumping memcache contents
  Number of buckets: 1
  Number of items  : 3
Dumping bucket 2 - 3 total items
add 74ibpvem1no6ssros60om3mlo5 0 1403169638 17
some|s:5:"thing";
add 01kims55ut0ukcko87ufh9dpv5 0 1403168854 17
some|s:5:"thing";

到目前为止,我们已经1)在php中创建了一个会话ID,2)将来自php的会话数据存储在memcached中,以及3)通过CLI确认该数据存在。

使用Node.js检索

这部分实际上非常简单。大部分繁重的工作已经由NPM模块完成。我制作了一个通过CLI运行的Node.js小脚本,但是您得到了图片:

var Memcached = require('memcached');
var PHPUnserialize = require('php-unserialize');

var mem = new Memcached('127.0.0.1:11211'); // connect to local memcached
var key = process.argv[2]; // get from CLI arg

console.log('fetching data with key:',key);
mem.get(key,function(err,data) { // fetch by key
        if ( err ) return console.error(err); // if there was an error
        if ( data === false ) return console.error('could not retrieve data'); // data is boolean false when the key does not exist
        console.log('raw data:',data); // show raw data
        var o = PHPUnserialize.unserializeSession(data); // decode session data
        console.log('parsed obj:',o); // show unserialized object
});

假设上述内容另存为m.js,则可以运行node m.js 74ibpvem1no6ssros60om3mlo5该命令,并输出如下内容:

fetching data with key: 74ibpvem1no6ssros60om3mlo5
raw data: some|s:5:"thing";
parsed obj: { some: 'thing' }

警告/陷阱

我的PHP应用程序之一在会话值中存储了一些二进制数据(即,已加密),但是密钥和普通会话对象保持不变(如上例所示)。在这种情况下,memcached-tool <host:port> dump将格式错误的序列化会话字符串打印到stdout;我认为这可能与标准输出无关,但是我错了。使用时PHPUnserialize.unserializeSession,也无法解析数据(以|)。我在网上尝试了其他几种会话反序列化方法,但没有成功。我认为memcached可与内部PHP会话保存处理程序一起在内部维护正确的数据,因此,在撰写本文时,我不确定这是反序列化方法还是memcached NPM模块根本不是不能正确检索/解释数据。当坚持使用非二进制数据(例如ascii或utf-8)时,它应该可以正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章