2013-11-22 91 views
2

我已經爲這個問題掙扎了2周,我用phpseclib從web發送命令給路由器執行不同的行爲,其中之一是重新啓動路由器的網絡接口,我很好重新啓動網絡接口,但運行命令後,整個apache凍結,並且不響應任何其他http請求,我使用的是phpseclib 0.3.5。非常感謝您的幫助第一用phpseclib重新啓動nic掛起整個apache

的Javascript

$.ajax({ 
    ajax work here to call the runCMDAdvance function and with timeout specified 
}); 

PHP

//function to run the command 
function runCMDAdvance($sshIP, $cmd, $tVal,$tarIP){ 
     $ssh = new Net_SSH2($sshIP,$this->port); 
     if (!$ssh->login($this->username, $this->password)){ 
      echo "Bad Login"; 
      return false; 
     } 
     //set timeout for running ssh command, should be done after the ssh object has been initialized 
     $tVal>0 ? $ssh->setTimeout($tVal):""; 

         $res = $ssh->exec($cmd); 
      $ssh->disconnect(); 
      return $res; 
} 

$cmd = INCL_PATH . ' && ' . '/sbin/uci commit network && '.'/sbin/uci commit dhcp && '.'/etc/init.d/network restart 2>&1 && exit'."\n"; 

      $res = $ssh2_conn->runCMDAdvance($ip, $cmd, 20, ""); 

我的猜測是,執行重新啓動網絡接口時,將AP斷開連接,並以某種方式崩潰phpseclib,但我不知道如何解決這個問題。任何幫助將不勝感激。

更新: 我只是做了一個實驗,每當我運行上面的ssh命令,Web服務器需要15.3分鐘處理其他請求...... http://i102.photobucket.com/albums/m112/ihmcjacky/Mobile%20Uploads/000_zpscc73f7f0.jpg

+0

如果網絡接口正在重新啓動,那麼'setTimeout'調用將不會執行任何操作,因爲在那個時候,phpseclib會丟失它自己的連接,它的phpseclib檢查是否已經過了多長時間 - 而不是服務器。真的,我認爲這裏的問題是你正在重新啓動nic。聽起來像其他任何命令 - 除了這一個 - 工作? – neubert

回答

0

要紐伯特:感謝您的反饋,其實多數的命令運行良好使用phpseclib。

提到服務器沒有響應,如果不可避免,我可以縮短服務器掛起的「死亡期」嗎?或者其他任何可行的解決方案?