Я использую 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 : LOAD: LAST:% 6.2lf% s GPRINT: LOAD: AVERAGE:% 6.2lf% s GPRINT: LOAD_max: MAX:% 6.2lf% sc
и передал этот cmd непосредственно в функцию PROC_OPEN, он может быть успешно выполнен
даже если оно совпадает с возвращаемым значением из функции rrdtool_command_build
Хотелось бы, чтобы я четко объяснил свою проблему, где моя ошибка и как я могу ее решить. Помогите мне, пожалуйста .
Задача ещё не решена.
Других решений пока нет …