phpseclib挂起webserver直到所有命令都运行完毕

时间:2014-10-25 01:03:14

标签: php phpseclib

我正在尝试向Debian服务器发送一些命令,这些命令需要30秒才能完成,这很好但是每当我的网络服务器上有人点击按钮(告诉php用phpseclib运行命令)时网站只是冻结(如果您尝试访问它,它只会继续加载和加载),直到所有命令都已运行或直到超时。

代码

    $this->_ssh = new Net_SSH2($this->_ip);

    if(!$this->_ssh->login($this->_username, $this->_password))
        die('Could not connect with SSH: Login failed!');


        $cd_to_subdir_command = 'cd ' . $this->_path . "\n";
        $rmdir_command = '[ -d ' . $this->_screen . ' ] || rm -rf ' . $this->_screen;
        $mkdir_command = 'mkdir ' . $this->_screen;
        $extract_command = 'tar -xzf hlds_no_amxx.tar.gz -C ' . $this->_screen . "\n";
        $chmod_command = 'chmod -R 777 ' . $this->_screen . "\n";


        $this->_ssh->read(':~$');
        $this->_ssh->write($cd_to_subdir_command . "\n");
        $this->_ssh->write($rmdir_command . "\n");
        $this->_ssh->write($mkdir_command . "\n");
        $this->_ssh->write($extract_command . "\n");
        $this->_ssh->write($chmod_command . "\n");
        $this->_ssh->setTimeout(30); // 30 seconds timeout to give it time to extract because the file is really big

        $this->_ssh->read();

我需要网络服务器不这样做,因为显然30秒的加载时间是一种痛苦,更不用说只有一个用户可以一次做一些东西。

2 个答案:

答案 0 :(得分:3)

如果您不需要立即获得结果,我会将代码放在外部脚本/ php文件中并且只运行

$this->ssh->exec('nohup php /full/path/file.php');

您可以在结尾处删除超时,然后让文件执行它必须执行的任何操作。 nohup把它放在后台。

答案 1 :(得分:1)

我看错了方向。 这里的问题不是服务器挂起或发送SSH命令时的类似内容。

我正在使用ajax来调用其中包含SSH代码的函数。在这种情况下,SSH代码是无关紧要的。 Web服务器只能处理来自客户端的一个ajax请求,因此在ajax请求返回成功或错误之前,客户端将无法使用该网站。

TLDR:这不是一个需要解决的问题。它的ajax是罪魁祸首,而不是ssh或debian服务器。