Что я имею
Это работает, но я хочу получить результат длительных скриптов
Запустите сценарий sh и затем вызовите функцию ajax, которая проверяет каждые 2 секунды и показывает результат. Это возможно?
$connection = ssh2_connect('192.168.1.1', 22);
ssh2_auth_password($connection, 'user', 'password');
$stream = ssh2_exec($connection, 'sh /test.sh');
stream_set_blocking($stream, true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
echo stream_get_contents($stream_out);
Что я буду
$connection = ssh2_connect('192.168.1.1', 22);
ssh2_auth_password($connection, 'user', 'password');
$stream = ssh2_exec($connection, 'sh /test.sh');
$session->stream = $stream; <-##### Here i save it in a session ######
########################################################
I want to save the Stream in a session variable
and check the result anytime while the process is still running
Is this possible ?
##########################################################
$stream = $session->stream; <-##### Here i get it from the session ######
stream_set_blocking($stream, true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
echo stream_get_contents($stream_out);
Когда я делаю это, я получаю следующую ошибку:
stream_set_blocking() expects parameter 1 to be resource, integer given
Хорошо, я понимаю, что это невозможно.
Мое решение:
Запустите скрипт в фоновом режиме и запишите результаты в output.txt
$stream = ssh2_exec($connection, 'sh /test.sh > output.txt &');
И читать выходной файл каждые 2 секунды, чтобы я мог следить за процессом.
в конце скрипта он будет отображать «ProcessFinished», поэтому с этим флагом вы знаете, что он завершен с запуском, и вам больше не нужно проверять output.txt.
$stream = ssh2_exec($connection, "cat output.txt");
stream_set_blocking($stream, true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
$processStatus = stream_get_contents($stream_out);
echo $processStatus;
РЕДАКТИРОВАТЬ:
Если вы также хотите ошибки, вы можете поставить 2>&1 в конце
$stream = ssh2_exec($connection, 'sh /test.sh > output.txt 2>&1 &');
Других решений пока нет …