Я пытаюсь отправить некоторые команды на сервер 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-секундная загрузка — это боль, и не говоря уже о том, что только один пользователь сможет делать что-то одновременно.
Если вам не нужен результат сразу, я бы поместил код во внешний скрипт / php файл и только запустил
$this->ssh->exec('nohup php /full/path/file.php');
Вы можете удалить тайм-аут в конце и просто позволить файлу выполнить все, что он должен делать. nohup помещает это в фон.
Я смотрел в неправильном направлении.
Проблема здесь не в зависании сервера или чем-то подобном при отправке команд SSH.
Я использую ajax для вызова функции, в которой есть код SSH. В этом случае код SSH не имеет значения. Веб-сервер может обрабатывать только один ajax-запрос от клиента, и из-за этого клиент не сможет использовать веб-сайт до тех пор, пока ajax-запрос не вернет успех или ошибку.
TLDR: это не проблема, которую нужно решать. Здесь виноват ajax, а не ssh или сервер Debian.