Функция Proc_open с предопределенной переменной команды - PullRequest
0 голосов
/ 07 сентября 2018

Я использую rrdtool в своем Ubuntu для создания диаграммы, rrdtool принимает параметры в команде для создания графика. Я пытаюсь создать эту опцию по php с помощью этой команды

$rrd_options="";


$unit_text = str_pad(substr($unit_text, 0, 18), 18);
$line_text = str_pad(substr($line_text, 0, 12), 12);

    $rrd_options = "$rrd_options". " 
 DEF:".$ds."=".$rrd_filename.":".$ds.":AVERAGE";
    $rrd_options ="$rrd_options". " 
 DEF:".$ds."_max=".$rrd_filename.":".$ds.":MAX";
    $rrd_options = "$rrd_options"."  
 DEF:".$ds."_min=".$rrd_filename.":".$ds.":MIN";



 $rrd_options ="$rrd_options". " AREA:".$ds."#".$colour_area.":";

        $rrd_options ="$rrd_options". " 
   AREA:".$ds."_max#".$colour_area_max.":";



$rrd_options ="$rrd_options". " 
  LINE1.25:".$ds."#".$colour_line.":'".$line_text."'";
$rrd_options ="$rrd_options". " GPRINT:".$ds.":LAST:%6.2lf%s";
$rrd_options ="$rrd_options". " GPRINT:".$ds.":AVERAGE:%6.2lf%s";
$rrd_options ="$rrd_options". " GPRINT:".$ds."_max:MAX:%6.2lf%s";

когда я печатаю эту переменную с помощью команды echo, результат будет таким:

DEF:LOAD=/var/www/html/rrd/10.10.0.144/fortigate_cpu.rrd:LOAD:AVERAGE DEF:LOAD_max=/var/www/html/rrd/10.10.0.144/fortigate_cpu.rrd:LOAD:MAX DEF:LOAD_min=/var/www/html/rrd/10.10.0.144/fortigate_cpu.rrd:LOAD:MIN AREA:LOAD#9999cc: AREA:LOAD_max#9999cc: LINE1.25:LOAD#0000cc:' ' GPRINT:LOAD:LAST:%6.2lf%s GPRINT:LOAD:AVERAGE:%6.2lf%s GPRINT:LOAD_max:MAX:%6.2lf%s

и я создал функцию для создания командной строки это функция

 function rrdtool_build_command($command, $filename, $rrd_options)
   {

   return "$command $filename $options";
    }

Я пытаюсь выполнить вывод rrdtool_build_command с помощью функции proc_open используя этот код

    $descriptorspec = array(
    0 => array("pipe", "r"),   

     1 => array("pipe", "w"), 
     2 => array("file", "/tmp/error-output.txt", "a") 
   );

 $cwd = '/tmp';

  $cmd=rrdtool_build_command(' rrdtool graph', $graph_file, $options);

  $process = proc_open($cmd, $descriptorspec, $pipes, $cwd, $env);

 if (is_resource($process)) {
  fclose($pipes[0]);
  stream_get_contents($pipes[1]);
   fclose($pipes[1]);
   $return_value = proc_close($process);

   echo "command returned $return_value\n";

результат при попытке выполнить команду:

команда вернула 127

с другой стороны, когда я помещаю параметры непосредственно в команду, которая выполняется без проблем. Я имею в виду, если я получу значение переменной rrd_options и создаю cmd вручную, как это

rrdtool graph 5wyFz8ARRvclaTk7.png DEF: LOAD = / var / www / html / rrd / 10.10.0.144 / fortigate_cpu.rrd: LOAD: СРЕДНЯЯ DEF: LOAD_max = / var / www / html / rrd / 10.10.0.144 / fortigate_cpu .rrd: LOAD: MAX DEF: LOAD_min = / var / www / html / rrd / 10.10.0.144 / fortigate_cpu.rrd: LOAD: MIN AREA: LOAD # 9999cc: AREA: LOAD_max # 9999cc: LINE1.25: LOAD # 0000cc: '' GPRINT: ЗАГРУЗКА: ПОСЛЕДНЯЯ:% 6.2lf% s GPRINT: ЗАГРУЗКА: СРЕДНЯЯ:% 6.2lf% s GPRINT: LOAD_max: MAX:% 6.2lf% sc

и передал этот cmd напрямую в функцию PROC_OPEN, он может быть успешно выполнен даже если оно совпадает с возвращаемым значением из функции rrdtool_command_build Хотелось бы, чтобы я четко объяснил свою проблему, где моя ошибка и как я могу ее решить. пожалуйста, помогите мне.

...