我有一个经典的Apache服务器来提供php文件,还有一个nodeJS服务器(带有socket.io,但没有快速连接),用于该PHP网站上的实时事件管理。有时我需要对连接到nodeJS服务器的客户端进行身份验证,但是当用户重新加载页面时,此身份验证会丢失,因为它还会重新加载socket.io客户端(我将套接字ID存储在服务器上,每次刷新时都会丢失该ID。 )
问题是:有没有办法让socket.io中的连接保持活动状态,还是链接apache PHP会话和nodeJS服务器的方法?还是一种使用cookie保持身份验证的方法(知道我必须存储敏感数据,例如用户密码和密钥)?
您可以memcached
在PHP中用作会话存储处理程序。Memcached是一个简单的键值存储,可以通过TCP进行访问;有一个可用于Node.js的memcached模块。
PHP通过使用会话ID作为键将会话存储在memcached中。存储在memcached中的会话数据(值)是一个序列化的PHP对象,略有不同。您可以在SO问题“使用Javascript解析PHP会话”中阅读有关此异常序列化的更多信息。幸运的是,已经有一个NPM模块:php-unserialize
。
现在介绍操作方法。
假设条件
session.save_handler='memcached'
和session.save_path='tcp://127.0.0.1:11211'
npm install memcached php-unserialize
准备
首先,仅需获取一些测试数据即可,请保存以下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] 删除。
我来说两句