会话变量值已更改并设置为零

时间:2015-12-30 19:16:39

标签: php html session-variables

我有三个文件:login.php,index.php,summary.php。当用户访问login.php时,我的所有会话变量都会被设置。以下是我的代码段:

<?php
            if( isset($_POST['submit']) )
            {

                $username = $_POST['username'];
                $password = $_POST['password'];
                $_SESSION['username'] = $username;                          

                if(!($con = ssh2_connect('192.168.1.7', 22))){                      
                    echo "<script> alert(\"Fail: Unable to establish connection\"); </script>";
                } 
                else {                  
                    if(!ssh2_auth_password($con, $username , $password )) {
                            echo "<script> alert(\"Fail: Unable to authenticate\"); </script>";
                    } 
                    else {

                        //echo "<script> alert(\"Successfully logged in\"); </script>";
                        $_SESSION['con'] = $con;                            
                        header("Location: index.php");
                        //echo $_SESSION['con'];
                    }
                }
            }
?>

当我在login.php中打印会话变量$_SESSION['con']时,它会按预期打印资源ID#1。下面是我的index.php文件,它使用了两个会话变量。

<?php    
  session_start();
  echo $_SESSION['username']; 
  echo $_SESSION['con'];  
?>

当我在index.php中打印会话变量时,$_SESSION['username']为我提供了正确的输出,但是$_SESSION['con']打印了0,它应该打印资源ID#1。也就是说,会话变量con的值已更改为零。

1 个答案:

答案 0 :(得分:3)

$conresource,您无法保留资源。如果需要使用它,您每次都必须重新创建ssh连接。

即使可以在会话中保留资源,ssh连接在将来的某个时间点也可能会失效,并且您必须重新创建它。

您不能坚持resources的原因是因为大多数(如果不是全部)映射到主机系统handles,而handles仅有效在创建它们的process的上下文中。由于每个PHP请求都会路由到专用process(新创建或从流程池中提取),因此您无法在两个单独的请求中使用resource它们很可能最终会被不同的流程服务。

在PHP手册网站上有一篇关于persistent database connections的非常好的文章。它很好地描述了PHP代码最终执行的不同设置,以及为什么持久连接有优点/缺点。

我还发现这个SO question关于建立持久的ssh连接。除了该问题中列举的解决方案之外,另一个可能的方法是编写一个保持ssh连接打开的守护进程,并在连接关闭时重新连接。然后,您将从PHP脚本连接到该守护程序。请注意,您仍然不会保存与守护程序的连接,并且每次需要时都必须重新创建它;这只是一个避免将用户名和密码保存到会话中的解决方案。