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

Session variable value changed and set to zero

我有三个文件: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 的值已更改为零。

$con 是一个 resource,你不能持久化资源。如果您需要使用它,则每次都必须重新创建 ssh 连接。

即使可以在您的会话中保留资源,ssh 连接也可能在将来的某个时候失效,您将不得不再次 re-create 它。

你不能坚持 resources 的原因是因为它们中的大多数(如果不是全部)映射到主机系统的 handles,并且 handles 仅在以下情况下有效创建它们的 process。由于每个 PHP 请求都被路由到专用的 process(新创建的或从进程池中提取的),因此您不能在两个单独的请求中使用 resource他们最终将由不同的进程提供服务。

PHP 手册网站上有一篇非常好的文章谈到 persistent database connections。它很好地描述了 PHP 代码最终执行的不同设置,以及为什么持久连接具有 advantages/disadvantages.

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