2013-03-12 68 views
1

我一直在试图序列化phpseclib连接,因为我从ajax加载一些PHP页面,我不想一次又一次地重新连接。如何序列化phpseclib?

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') ..

有没有办法,或者我将不得不始终连接/登录到Net/SSH2.php,每当我在该PHP页面?

回答

0

有一个持久连接的唯一方法是实际上有一个脚本不断运行,保持连接打开。这意味着你有一个脚本永远不会结束while (true) { ... }循环,它会打开一个连接并保留它。然后您需要找到一种与此脚本进行通信的方式,以使其执行命令。 AMQP,ØMQ,Gearman,可以采用套接字和类似的技术。

+0

大多数服务器不允许......最终大多数服务器将其关闭以避免过时的进程或进程被锁定在永久循环中。 – fredrik 2013-03-12 13:01:17

+0

当然,在共享服务器上这可能不起作用。 – deceze 2013-03-12 13:01:54

+0

如果我可以根据我的要求配置服务器,我最好的选择是什么?我正在制作一个内联网应用程序...供内部使用 – django 2013-03-12 13:11:37

2

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

如果phpseclib使用pfsockopen,它可能能够重新使用现有连接 - 但这是一个很大的问题,并且可能需要修改该库。

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

+0

静态变量同样没用。 – deceze 2013-03-12 12:57:25

+0

很高兴知道 - 我在某个地方看过它会在5.3之后工作,但那是传闻。 – fredrik 2013-03-12 12:58:32

+0

所以我唯一的出手就是一次又一次的记录..对吧? 如果是的话,它应该是一个服务器的问题,以保持日志记录这么多..? – django 2013-03-12 13:00:34