我有三个文件: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
的值已更改为零。
答案 0 :(得分:3)
$con
是resource,您无法保留资源。如果需要使用它,您每次都必须重新创建ssh连接。
即使可以在会话中保留资源,ssh连接在将来的某个时间点也可能会失效,并且您必须重新创建它。
您不能坚持resources
的原因是因为大多数(如果不是全部)映射到主机系统handles
,而handles
仅有效在创建它们的process
的上下文中。由于每个PHP
请求都会路由到专用process
(新创建或从流程池中提取),因此您无法在两个单独的请求中使用resource
它们很可能最终会被不同的流程服务。
在PHP手册网站上有一篇关于persistent database connections的非常好的文章。它很好地描述了PHP代码最终执行的不同设置,以及为什么持久连接有优点/缺点。
我还发现这个SO question关于建立持久的ssh连接。除了该问题中列举的解决方案之外,另一个可能的方法是编写一个保持ssh连接打开的守护进程,并在连接关闭时重新连接。然后,您将从PHP脚本连接到该守护程序。请注意,您仍然不会保存与守护程序的连接,并且每次需要时都必须重新创建它;这只是一个避免将用户名和密码保存到会话中的解决方案。