Pipe the content of a variable to a process [message #173018] |
Thu, 17 March 2011 19:27  |
Marco
Messages: 11 Registered: March 2011
Karma: 0
|
Junior Member |
|
|
Hi,
how can I pipe the content of a variable into a process' standard input and
save its output into another variable?
To make it clear what I want to achieve here's a small bash example that
processes the data »foo« with the process »sed« and writes the output into the
variable OUT.
IN='foo'
OUT=`echo $IN | sed 's/o/a/g'`
I need to do the same in PHP, pipe the data from $IN (a PHP variable) through
a process into $OUT (also a PHP variable).
Marco
|
|
|
Re: Pipe the content of a variable to a process [message #173021 is a reply to message #173018] |
Thu, 17 March 2011 21:35   |
Marco
Messages: 11 Registered: March 2011
Karma: 0
|
Junior Member |
|
|
On 2011-03-17 Marco <netuse(at)lavabit(dot)com> wrote:
> Hi,
>
> how can I pipe the content of a variable into a process' standard input and
> save its output into another variable?
> [...]
I made some progress. But I still have problems. In the following example I
can use »cat« as process without problems. But gnuplot produces no output, but
a return value of zero, that means it's successfull. But where's the output?
When I call gnuplot with the »passthru« command it works as expected that
means that it is in the PATH and produces output on stdout with the given
input. What's the problem here?
<?php
$stdin_data = 'set terminal svg;plot sin(x)';
$descriptorspec = array(
0 => array( 'pipe', 'r' ), // stdin to read from
1 => array( 'pipe', 'w' ), // stdout to write to
2 => array( 'pipe', 'a' ), // stderr
);
// This works
// $process = proc_open( 'cat', $descriptorspec, $pipes );
// This doesn't produce output
$process = proc_open( 'gnuplot', $descriptorspec, $pipes );
if ( is_resource( $process ) ) {
fwrite( $pipes[0], $stdin_data );
fclose( $pipes[0] );
$content = stream_get_contents( $pipes[1] );
fclose( $pipes[1] );
fclose( $pipes[2] );
$return_value = proc_close( $process );
// cat and gnuplot return 0
echo $return_value . "\n";
echo $content;
// This works
// passthru( "gnuplot -e '$stdin_data'" );
}
?>
Marco
|
|
|
Re: Pipe the content of a variable to a process [message #173024 is a reply to message #173021] |
Fri, 18 March 2011 02:30   |
Jerry Stuckle
Messages: 2598 Registered: September 2010
Karma: 0
|
Senior Member |
|
|
On 3/17/2011 5:35 PM, Marco wrote:
> On 2011-03-17 Marco<netuse(at)lavabit(dot)com> wrote:
>
>> Hi,
>>
>> how can I pipe the content of a variable into a process' standard input and
>> save its output into another variable?
>> [...]
>
> I made some progress. But I still have problems. In the following example I
> can use »cat« as process without problems. But gnuplot produces no output, but
> a return value of zero, that means it's successfull. But where's the output?
>
> When I call gnuplot with the »passthru« command it works as expected that
> means that it is in the PATH and produces output on stdout with the given
> input. What's the problem here?
>
> <?php
> $stdin_data = 'set terminal svg;plot sin(x)';
>
> $descriptorspec = array(
> 0 => array( 'pipe', 'r' ), // stdin to read from
> 1 => array( 'pipe', 'w' ), // stdout to write to
> 2 => array( 'pipe', 'a' ), // stderr
> );
>
> // This works
> // $process = proc_open( 'cat', $descriptorspec, $pipes );
>
> // This doesn't produce output
> $process = proc_open( 'gnuplot', $descriptorspec, $pipes );
>
> if ( is_resource( $process ) ) {
> fwrite( $pipes[0], $stdin_data );
> fclose( $pipes[0] );
> $content = stream_get_contents( $pipes[1] );
> fclose( $pipes[1] );
> fclose( $pipes[2] );
>
> $return_value = proc_close( $process );
>
> // cat and gnuplot return 0
> echo $return_value . "\n";
> echo $content;
>
> // This works
> // passthru( "gnuplot -e '$stdin_data'" );
> }
> ?>
>
>
> Marco
>
What's in stderr? What happens if you write stdout and stderr to a file
(for testing)?
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Re: Pipe the content of a variable to a process [message #173051 is a reply to message #173049] |
Fri, 18 March 2011 21:12  |
Jerry Stuckle
Messages: 2598 Registered: September 2010
Karma: 0
|
Senior Member |
|
|
On 3/18/2011 4:09 PM, Marco wrote:
> On 2011-03-18 Jerry Stuckle<jstucklex(at)attglobal(dot)net> wrote:
>
>> On 3/18/2011 3:21 PM, Marco wrote:
>>> On 2011-03-18 Jerry Stuckle<jstucklex(at)attglobal(dot)net> wrote:
>>>
>>>> Are you running your test from the CLI? Or are you trying to run it as
>>>> part of the web page?
>>>>
>>>> If the latter - are you putting out valid html? Have you looked at the
>>>> document source to see what's there?
>>>
>>> At first I tried putting it into a (valid) web page. During the creation
>>> of the minimal example I removed all the html stuff. I sent the complete
>>> script in my second post in this thread. When I look directly at the
>>> source I just see the »0« (echo $return_value . "\n";). And when I
>>> redirect stdout and stderr to a file there's a »0« in file_stdout and
>>> file_stderr is empty.
>>>
>>> I have absolutely no clue what's going on here, since it works with »cat«
>>> as a process and gnuplot works with »passthru«. That »cat« works means
>>> that my workflow with the pipes is right and that gnuplot works with
>>> »passthru« means that gnuplot is working inside PHP.
>>>
>>> Thanks for your help, I hope we can get it solved.
>>>
>>> Marco
>>>
>>
>> OK, I downloaded and installed gnuplot on my system. Change this line:
>>
>> $stdin_data = "set terminal svg;plot sin(x)\n";
>>
>> Note the newline char at the end.
>
> Thats it!!!!! Million thanks.
>
> How can that be?! In the shell it works without »\n«. Anyway, thanks for the
> effort you put into solving my problem.
>
>
> Marco
>
No, when you use the shell, pressing enter sends the newline.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
|
|
|