Похоже, у меня проблемы с использованием потоков, которые передаются в процесс при использовании функции proc_open () php.
Процесс, который я запускаю, - это просто утилита конвертации ImageMagick для создания 3 изображений.друг на другаКогда используется только 1 входной поток (STDIN) и в этот поток выгружается переменная, программа конвертации работает нормально и возвращает свой вывод, который может быть сохранен в переменной следующим образом:
$cmd = BIN_PATH.DIRECTORY_SEPARATOR.'convert ';
$cmd .= ' -size SOMESIZE ';
$cmd .= ' -background black ';
$cmd .= ' -fill white ';
$cmd .= ' -stroke none ';
$cmd .= ' -gravity center ';
$cmd .= ' -trim ';
$cmd .= ' -interline-spacing SOMELINEHEIGHT ';
$cmd .= ' -font SOMEFONT ';
$cmd .= ' label:"SOMETEXT" ';
$cmd .= ' miff:- ';
$ctext_opacity = shell_exec($cmd);
Сначала я запускаюпреобразовать и сохранить выходные данные в переменной $ ctext_opacity.Затем следующая команда вызывается через proc_open (), а переменная $ ctext_opacity передается через STDIN и используется в качестве входного изображения:
$cmd = BIN_PATH.DIRECTORY_SEPARATOR.'convert ';
$cmd .= '-size SOMESIZE ';
$cmd .= ' xc:\'rgb(230, 225, 50)\' ';
$cmd .= ' -gravity center ';
$cmd .= ' - '; // ImageMagick uses dash(-) for STDIN
$cmd .= ' -alpha Off ';
$cmd .= ' -compose CopyOpacity ';
$cmd .= ' -composite ';
$cmd .= ' -trim ';
$cmd .= ' miff:- ';
$chighlight = '';
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w")
);
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $ctext_opacity);
fclose($pipes[0]);
while (!feof($pipes[1])) {
$chighlight .= fgets($pipes[1]); // HERE WE FEED THE OUTPUT OF "CONVERT" TO $chighlight
}
//echo $chighlight; die();
fclose($pipes[1]);
$return_value = proc_close($process);
}
Вышеупомянутая команда вызывается 3 раза, и генерируются 3 отдельных изображения, ихранится в 3 переменных.Предполагается, что следующая команда примет эти 3 переменные в качестве входных изображений (синтаксис ImageMagic определяет альтернативные потоки ввода-вывода, такие как fd: N, где N - номер потока, который я порождаю через proc_open ()).Тем не менее, я, кажется, пишу во входные потоки или неправильно читаю из STDOUT, что, скорее всего, приводит к тому, что выход из процесса сбрасывается, что приводит к его зависанию без завершения.
$cmd = BIN_PATH.DIRECTORY_SEPARATOR.'convert ';
$cmd .= ' -size SOMESIZE ';
$cmd .= ' xc:transparent ';
$cmd .= ' -gravity center ';
$cmd .= ' - -geometry -2-2 -composite ';
$cmd .= ' fd:3 -geometry +2+2 -composite ';
$cmd .= ' fd:4 -composite ';
$cmd .= 'png:- ';
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "a"),
3 => array("pipe", "r"),
4 => array("pipe", "r")
);
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
$read = null;
$rd = array($pipes[1]);
$write = array($pipes[0], $pipes[3], $pipes[4]);
$wt = array($pipes[0], $pipes[3], $pipes[4]);
$im_args = array($cshade, $chighlight, $ctext);
$except = null;
$readTimeout = 1;
$ctext_deboss = '';
$numchanged = stream_select($read, $write, $except, $readTimeout);
foreach($write as $w) {
$key = array_search($w, $wt);
fwrite($wt[$key], $im_args[$key]);
fclose($wt[$key]);
$read = array($pipes[1]);
$rd = array($pipes[1]);
$write = null;
$except = null;
$readTimeout = 1;
$ctext_deboss = '';
$numchanged = stream_select($read, $write, $except, $readTimeout);
foreach($read as $r) {
while (!feof($r)) {
$ctext_deboss .= fgets($pipes[1]);
}
}
fclose($pipes[1]);
$return_value = proc_close($process);
echo $ctext_deboss; die();
}
}
Я не могу передатьсодержимое 3 и 4 каналов при преобразовании выдает ошибку с пустыми / неверными данными