Мне нужно запустить в фоновом режиме команду оболочки (которая использует ruby-скрипт из /usr/local/bin), используя php (из формы html/php) и игнорируя весь вывод. Я пробовал безуспешно exec()
, system()
, shell_exec()
.
Кроме того, выполнение сценария (не написанного мной, ссылка на скрипт - я не знаю ruby) в терминале и перенаправление стандартного вывода на /dev/null, он продолжает показывать информацию в режиме реального времени о ходе загрузки и скорости загрузки пока он не будет завершен.
Полагаю, это из-за сценария, и я где-то читал, что proc_open()
может помочь, но я не знаю, как его использовать.
РЕДАКТИРОВАТЬ
Также добавив "&" к команде (в терминале), она продолжает показывать информацию в реальном времени о ходе загрузки и скорости загрузки до ее завершения.
/usr/local/apache2/htdocs$ ls
1.php ruby_prog.rb
1.php:
<div>hello</div>
<div>
<?php
$command = 'ruby ruby_prog.rb';
$output = [];
exec($command, $output, $return_var);
echo($output[0]);
?>
</div>
ruby_prog.rb:
puts 'world'
URL:
http://localhost:8181/1.php
вывод в браузере:
hello
world
source html:
<div>hello</div>
<div>
world</div>
Вы можете проверить значение $return_var
--if на 0, тогда программа ruby успешно работала; если оно отличное от нуля, произошла ошибка.
Если вам не нужен какой-либо вывод, вы можете использовать команду:
ruby ruby_prog.rb > /dev/null 2>&1
>
Отправляет stdout в /dev/null, который является приемником, то есть он действует как черная дыра, а 2>&1
говорит, чтобы отправить stderr (2) туда, куда идет stdout (& 1).