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: The above proc_open solution does work (better) for the `ls | ls | ls | ls | ls` test case, but not my real-world problem. This is becoming a nasty bug(?) to work around. Previous Comments: ------------------------------------------------------------------------ [2012-05-09 09:27:50] mrvanes at gmail dot com 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. ------------------------------------------------------------------------ [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. ------------------------------------------------------------------------ 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