2013-03-12 35 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