2014-09-22 2 views
2

В настоящее время у меня есть сценарий, который использует SSH2 для выполнения c-программы на сервере, однако веб-страница занимает x секунд, чтобы загрузить сценарий. Есть ли способ заставить php отправить команду через ssh и не дождаться ответа? Благодаря Мой текущий код:Как заставить PHP загружаться, не дожидаясь ssh2

<?php 
$ssh = ssh2_connect('********', 22); 
ssh2_auth_password($ssh, 'root', '**********'); 
$stream = ssh2_exec($ssh, './sr1 80 4 400 400 20'); 
fclose($stream); 
?> 

(Censored сервер IP и пароль по понятным причинам)

+3

Похоже, вы пытаетесь сделать асинхронный запрос *. –

+1

Вы можете поместить этот бит в свой собственный файл, а затем просто вызвать этот файл из основного скрипта с помощью 'exe()', после чего он будет работать синхронно. –

+1

ssh2_exec по умолчанию не блокируется. Возможно, ваша проблема - это fclose. Вам нужно позвонить ему прямо сейчас? – amo

ответ

0

Вы можете запустить свой код в Thread для того, чтобы запустить его асинхронно:

<?php 
class MySsh extends Thread { 
    public function run() { 
     $ssh = ssh2_connect('********', 22); 
     ssh2_auth_password($ssh, 'root', '**********'); 
     $stream = ssh2_exec($ssh, './sr1 80 4 400 400 20'); 
     fclose($stream); 
    } 
} 
$mySsh = new MySsh(); 
var_dump($mySsh->start()); 
?> 

Примечание что для использования Thread s в php вам необходимо установить библиотеку pthreads.

+0

С этим я получаю эту ошибку: «Fatal error: Class» Thread «not found in» и команда не отправлена. – CarlosAllende

+0

@GeorgeWBush Извините, вам нужны pthreads. Я отредактировал свой ответ. –

+0

Устанавливает pthreads somthing, что можно легко сделать? – CarlosAllende

0

ssh2_connect, ssh2_auth_password требуется для входа в систему ssh.

ssh2_exec выполнить команду с заданным вторым аргументом './sr1'. Не могли бы вы указать, что именно он делает с помощью фрагментов?

Во-вторых, ssh2_exec: выполнить команду на удаленном сервере. и я думаю, что он будет ждать, пока ваша команда завершит выполнение, а затем вернется.

Вы можете попробовать использовать ssh2_shell: Запрос интерактивной оболочки

Вы, вероятно, откройте оболочку и вызвать вашу команду для запуска фона или в другом процессе и выхода из оболочки. Я думаю, что это может быть быстрее, чем ssh2_exec.

1

Использование http://phpseclib.sourceforge.net/ ...

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('********', 22); 
$ssh->login('root', '**********'); 
$ssh->enablePTY(); 
$ssh->exec('nohup ./sr1 80 4 400 400 20 &'); 

Вы можете попробовать его с и без поЬир и &, но я думаю, что они необходимы.

Смежные вопросы