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

Reply via email to