1

我一直在尝试序列化 phpseclib 连接,因为我正在从 ajax 加载一些 php 页面并且我不想一次又一次地重新连接。

第 1 页 - 首先定义 SSH2

require("Net/SSH2.php");
session_start();
$ssh = new Net_SSH2 ("localhost");
if ($ssh->login($username, $pass)) {
$_SESSION['obj'] = serialize($ssh);

}else{
echo "Invalid Login !!!";
}

第 2 页 - 使用反序列化获取存储的会话

session_start();
require("Net/SSH2.php");
$ssh = unserialize($_SESSION['obj']);
echo $ssh->exec('ls');

我也想输入登录信息,$_SESSION['obj']所以每当我在那个 php 页面上时,我只是$ssh = unserialize($_SESSION['obj']);然后$ssh->exec('pwd')..

是否有解决方法,或者每当我在那个 PHP 页面上时,我是否必须始终连接/登录到 Net/SSH2.php?

4

2 回答 2

2

根据您拥有的 PHP 版本,您可以尝试为 ssh 连接声明一个静态变量。

如果 phpseclib 使用 pfsockopen 它可能能够重用现有的连接 - 但这是一个长期的目标,并且可能需要修改库。

但一般来说,你不能在 PHP 中做你想做的事。脚本完成后,所有打开的套接字都将关闭,因为执行过程终止。您当然不能将它存储在会话变量中 - 一旦 Net_SSH2 对象超出范围,它就会被销毁。

于 2013-03-12T12:56:10.550 回答
0

拥有持久连接的唯一方法是让脚本不断运行,以保持连接打开。这意味着你有一个脚本,它有一个永无止境的while (true) { ... }循环,它会打开一个连接并保持它。然后,您需要找到一种与此脚本通信的方法,以使其执行命令。AMQPØMQGearman、 sockets 和类似的技术可以用于此。

于 2013-03-12T13:00:18.867 回答