Php 怪异的node.js和redis行为
我有一个无法解释的问题。以下是我想要的:Php 怪异的node.js和redis行为,php,javascript,node.js,redis,Php,Javascript,Node.js,Redis,我有一个无法解释的问题。以下是我想要的: 客户端通过socket.io连接到节点服务器,发送他的SID Redis验证所述SID是否在其存储中,如果不在,则不发出“已验证”,如果SID在存储中,则发出“已验证” 收到认证后,将提供额外的选项 听起来很简单,应该是这样。然而,这种情况会发生: 客户端与redis存储中的SID连接 Node.js服务器验证SID是否在存储区中,但未能发出所述“已验证” 但是,当我重新启动节点服务器时,一切似乎都正常工作:S。但是当我继续从存储中删除密钥,并再
- 客户端通过socket.io连接到节点服务器,发送他的SID
- Redis验证所述SID是否在其存储中,如果不在,则不发出“已验证”,如果SID在存储中,则发出“已验证”
- 收到认证后,将提供额外的选项
- 客户端与redis存储中的SID连接
- Node.js服务器验证SID是否在存储区中,但未能发出所述“已验证”
<?php
session_start();
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
require "./libraries/Predis.php";
if(isset($_GET['logout'])) {
session_regenerate_id();
}
$sid = sha1(session_id());
$redis = new Predis\Client();
echo "<h1>SID: " . $sid . "</h1>";
if(isset($_GET['auth'])) {
$redis->set($sid, mt_rand(1,20000));
$redis->expire($sid, 1800);
echo "auth set<br />";
}
if ($redis->get($sid)) {
// he is authenticad, show something else
echo "auth found<br />";
}
?>
<html>
<head>
<title>Node Test VTclient</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script src="http://the_server.dev:11337/socket.io/socket.io.js"></script>
</head>
<body>
<p id="text">access denied</p>
<script type="text/javascript">
var connected = false;
var authenticated = false;
if(typeof io == 'undefined') {
trigger_error();
} else {
var socket = io.connect('http://vtvserver.dev:11337/', {
'reconnection delay' : 1,
'max reconnection attempts' : 1
});
socket.on('connect', function (data) {
connected = true;
socket.emit('success_connect',{sid: '<?php echo $sid; ?>'});
$('#text').html('connected');
socket.on('get_bids', function (data) {
$('#bids').html('');
if(typeof data === 'object') {
$.each(data.rows, function(key, value) {
add_bid(value.bid_id, value.bid_amount);
});
}
}).on('reconnecting', function (reason) {
trigger_error(reason);
$('#text').html('disconnected');
socket.disconnect();
}).on('authenticated', function(data) {
$('#text').html('authorised!');
// successful auth
$('#bidding').show();
}).on('disconnect', function (data) {
connected = false;
}).on('bid_placed', function (data) {
add_bid(data.id, data.amount);
}).on('own_bid_placed', function(data){
if(!data.error) {
alert('bieding geplaatst!');
} else {
alert('Uw bieding is ongeldig.');
}
});
});
}
function trigger_error(reason) {
$('#text').html('Server is down...');
}
function add_bid(id, amount) {
$('#bids').append($('<option>', { value : id }).text(amount));
}
$(function() {
$('#disconnect').click(function() {
if(connected === true) {
socket.disconnect();
$('#text').html('Disconnected from server.');
}
});
$('#bid').click(function() {
var amount = $('#amount').val();
// commit the bid to the server
socket.emit('add_bid', {amount: amount});
});
})
</script>
<label for="bids">Biedingen:</label>
<select name="bids" id="bids" multiple='multiple' style='width:100px; height:150px'></select>
<fieldset style="display:none" id="bidding">
<legend>Plaats bieding</legend>
<label for="amount"><Bedrag: </label><input type="text" id="amount" name="amount" value='0' />
<button id="bid">Bied</button>
</fieldset>
<button id="disconnect">Disconnect</button>
</body>
节点测试客户端
访问被拒绝
var=false;
var=false;
如果(io类型==‘未定义’){
触发器_错误();
}否则{
var socket=io.connect('http://vtvserver.dev:11337/', {
“重新连接延迟”:1,
“最大重新连接尝试次数”:1
});
socket.on('connect',函数(数据){
连接=真;
emit('success_connect',{sid:'});
$('#text').html('connected');
socket.on('get_bids',函数(数据){
$('#bids').html('');
如果(数据类型===‘对象’){
$.each(数据行、函数(键、值){
添加投标(value.bid\u id、value.bid\u金额);
});
}
}).on('重新连接')功能(原因){
触发错误(原因);
$('#text').html('disconnected');
socket.disconnect();
}).on('authenticated',函数(数据){
$('text').html('authorized!');
//成功的作者
$('投标').show();
}).on(断开连接),功能(数据){
连接=错误;
}).on('bid_placed')功能(数据){
添加投标(data.id、data.amount);
}).on(‘自有投标’)功能(数据){
如果(!data.error){
警报(“bieding geplaatst!”);
}否则{
警报(“Uw bieding是ongeldig”);
}
});
});
}
功能触发错误(原因){
$('#text').html('服务器已关闭…');
}
功能添加投标(id、金额){
$('#bids').append($('',{value:id}).text(amount));
}
$(函数(){
$(“#断开连接”)。单击(函数(){
如果(已连接===true){
socket.disconnect();
$('#text').html('与服务器断开连接');
}
});
$('#bid')。单击(函数(){
变量金额=$(“#金额”).val();
//将出价提交给服务器
emit('add_bid',{amount:amount});
});
})
比丁根:
普拉茨比丁酒店
我通过在客户端连接时创建redis客户端修复了此问题:
io.on('connection', function (socket) {
var redis_client = redis.createClient(cfg.redis.port, cfg.redis.host);
});
是的,它是:redis_client=redis.createClient(cfg.redis.port,cfg.redis.host)和:redis_client.get(data.sid,function(err,reply){并且不提供任何服务?对不起,我的眼睛一定被滚动条遮住了。看起来你可能过早地破坏了mysql连接(看起来,当您获得套接字连接时,您将建立一个mysql连接,设置一些依赖该连接的处理程序,然后终止连接)。
io.on('connection', function (socket) {
var redis_client = redis.createClient(cfg.redis.port, cfg.redis.host);
});