会话变量值已更改并设置为零
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 脚本连接到该守护进程。请注意,您仍然不会保存与守护程序的连接,并且每次需要时都必须重新创建它;这只是避免将用户名和密码保存到会话中的解决方案。
我有三个文件: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 脚本连接到该守护进程。请注意,您仍然不会保存与守护程序的连接,并且每次需要时都必须重新创建它;这只是避免将用户名和密码保存到会话中的解决方案。