Using php proc_open() with multiple input streams
Posted: 2012-03-21T18:14:24-07:00
0 down vote favorite
share [g+] share [fb] share [tw]
Seems like I'm having problems using the streams which are piped to a process when using the proc_open() php function.
The process I'm starting is simply the convert ImageMagick utility to compose 3 images on top of each other. When only 1 input stream is used (STDIN) and a variable is dumped into that stream the convert program works fine and returns its output which can be stored in a variable like so:
First I run the convert and store the output in the $ctext_opacity variable. Then the next command is called through proc_open() and the $ctext_opacity variable is piped trough the STDIN and used as an input image:
The above command is called 3 times and 3 separate images are generated and stored in 3 variables. The next command is supposed to accept those 3 variables as input images (the ImageMagic syntax specifies the alternative io streams like fd:N where N is the number of the stream which I spawn through proc_open()). However I seem to be writing to the input streams or reading from the STDOUT incorrectly which results most probably in unflushed output from the process which causes it to hang without terminating.
I can't seem to transfer the 3 & 4 pipes' contents as convert throws an error with empty/incorrect data
share [g+] share [fb] share [tw]
Seems like I'm having problems using the streams which are piped to a process when using the proc_open() php function.
The process I'm starting is simply the convert ImageMagick utility to compose 3 images on top of each other. When only 1 input stream is used (STDIN) and a variable is dumped into that stream the convert program works fine and returns its output which can be stored in a variable like so:
Code: Select all
$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);
Code: Select all
$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);
}
Code: Select all
$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();
}
}