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是否在存储区中,但未能发出所述“已验证”
但是,当我重新启动节点服务器时,一切似乎都正常工作:S。但是当我继续从存储中删除密钥,并再次添加它(通过?auth和?logout)时,“authenticated”不会再次发出

客户端代码:

<?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);
});