Edit report at https://bugs.php.net/bug.php?id=51160&edit=1
ID: 51160
Comment by: mrvanes at gmail dot com
Reported by: poehler at interworx dot com
Summary: Exec family of functions runs a script piped into
'head' too until script end
Status: Not a bug
Type: Bug
Package: *General Issues
Operating System: CentOS 5.4
PHP Version: 5.2.13
Block user comment: N
Private report: N
New Comment:
Ok, so I finally think to have cracked the problem:
This seem to be the equivalent of exec('cmd', &$output) that does not create a
broken pipe:
$p = proc_open("ls | ls | ls | ls | ls | ls | ls | echo `date` >> foobar | ls",
array(
array("pipe","r"),
array("pipe","w"),
array("pipe","w")
),
$pipes
);
while (($buffer = fgets($pipes[1])) !== false) $output[] = trim($buffer);
foreach ($pipes as $pipe) fclose($pipe);
if (isset($output)) print_r($output);
There is no broken pipe and the file foobar now contains the output of date.
Previous Comments:
------------------------------------------------------------------------
[2012-05-09 07:09:14] mrvanes at gmail dot com
I must correct: the SIGPIPE sighandler does suppress the message but does not
solve the problem! The command that generates the broken pipe fails.
------------------------------------------------------------------------
[2012-05-07 08:39:34] mrvanes at gmail dot com
I was encountering a similar problem too and for some reason Mike's hint
(registering an empty/exit function on the SIGPIPE signal) solved the problem
for
me.
The only problem I now have is racking my brains over WHY?! Is this discussed
somewhere so I can read up on the given solution?
------------------------------------------------------------------------
[2012-01-19 12:26:16] burek021 at gmail dot com
Just to say, my problem somehow got misteriosly solved. I don't know exactly
what was the culprit, but I know I've messed around with ulimit and with
apache2.conf:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 100
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
More details here (if needed):
http://www.linuxquestions.org/questions/showthread.php?p=4577927
------------------------------------------------------------------------
[2012-01-18 21:59:26] burek021 at gmail dot com
I also have this issue. I've tried to test a simple example on several of our
web hosting machines and all of them have this issue present.
Simple test. Create a php file (test.php) with this content:
==================
<?php
shell_exec('ls | ls | ls | ls' );
==================
and then run: php -f test.php 2>&1
you should get the error like: ls: write error: Broken pipe
almost every time you run that command.
I'm not sure what's the reason for this, but I'm pretty sure it's the bug,
since the bash/sh doesn't ever raise that error no matter how many ls'es we put
into the pipe.
------------------------------------------------------------------------
[2010-12-07 21:57:02] sirjava at gmail dot com
I'm confused. If the exec family of functions is designed to execute something
as if executed from a shell, and the command executes properly from a shell,
but not in php... how is this not a php bug?
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=51160
--
Edit this bug report at https://bugs.php.net/bug.php?id=51160&edit=1