ID:               18833
 Comment by:       simeonl at dbc dot co dot nz
 Reported By:      antoine dot bajolet at tdf dot fr
 Status:           No Feedback
 Bug Type:         *General Issues
 Operating System: GNU/Linux 2.4.9 RH 7.1
 PHP Version:      4.2.1
 New Comment:

OK, sorry, further testing revealed that klaus' fix hadn't worked for
me after all, and the problem *doesn't* seem to be in exec.  I can't be
certain that we even have the same problem.

I was able to track it down though by using a function like this:

// Before using this method, you need to run "apt-get install lsof" on
your server.
public static function countOpenFiles()
{
  return count(explode("\n", trim(shell_exec("lsof -p '" .
posix_getpid() . "'" ))));
}

Logging the output at key points helped me track down the handle
"leak", which turned out to be PDO (using persistent connections fixed
it).


Previous Comments:
------------------------------------------------------------------------

[2010-02-18 02:09:12] simeonl at dbc dot co dot nz

I got the same problem with a CLI script running repeated exec
commands.  

PHP 5.2.11-0.dotdeb.1 with Suhosin-Patch 0.9.7 (cli) (built: Sep 19
2009 23:21:37)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with Suhosin v0.9.29, Copyright (c) 2007, by SektionEins GmbH

(Debian - Lenny)

Adopting the suggested "user_proc_exec" workaround has fixed the
problem, which does suggest the exec might not be closing it's pipes
properly.

------------------------------------------------------------------------

[2009-12-19 12:39:56] klaus dot wendel at lednew dot de

I've forgotten: Please aslo add a

$result = explode("\n",trim($result));

function user_proc_exec ($command,& $result,& $status)
        {
        $process = proc_open(
                        $command,
                        array(
                        0 => array("pipe", "r"), //STDIN
                        1 => array("pipe", "w"), //STDOUT
                        2 => array("pipe","w")), //STDERR
                        $pipes
                        );
        $result = stream_get_contents($pipes[1]);
        $error = stream_get_contents($pipes[2]);
        fclose($pipes[1]);
        fclose($pipes[2]);
        $status= proc_close($process);
        $result = explode("\n",trim($result));
    return($error);
        }

------------------------------------------------------------------------

[2009-12-19 12:26:49] klaus dot wendel at lednew dot de

[Ubuntu karmic 9.10; php-cli 5.2.10]

> The per-user process number limit is set in 
> /etc/security/limits.conf.
> In my case, it was enough to raise it and reboot.

In my case, this wasn't the answer, unfortunately. Or fortunately,
because I was forced to find a workaround, which could help others,
too.

In my code I replaced exec by following function:

function user_proc_exec ($command,& $result,& $status)
        {
        $process = proc_open(
                        $command,
                        array(
                        0 => array("pipe", "r"), //STDIN
                        1 => array("pipe", "w"), //STDOUT
                        2 => array("pipe","w")), //STDERR
                        $pipes
                        );
        $result = stream_get_contents($pipes[1]);
        $error = stream_get_contents($pipes[2]);
        fclose($pipes[1]);
        fclose($pipes[2]);
        $status= proc_close($process);
    return($error);
    }

Everything is working fine now.

------------------------------------------------------------------------

[2009-05-04 14:42:05] scherbakov_koksa at mail dot ru

It seems I've finally figured out the reason (after a huge amount of
googling UNIX forums).

The PHP fork() error is accompanied by the following entries in Apache
error_log:

[Mon May 04 20:55:59 2009] [alert] (11)Resource temporarily
unavailable: setuid: unable to change to uid: 48
[Mon May 04 20:55:59 2009] [alert] Child 10053 returned a Fatal
error... Apache is exiting!

The system configuration doesn't allow Apache to execute more than N
child processes simultaneously. Apache runs out of this limit and can't
start any more processes. Hence is the error.

The per-user process number limit is set in /etc/security/limits.conf.
In my case, it was enough to raise it and reboot.

------------------------------------------------------------------------

[2009-03-09 13:33:36] steveg at bscopes dot com

1. did you ever figure out what caused this problem?
2. do you know which apache/php parameters to adjust ?

------------------------------------------------------------------------

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
    http://bugs.php.net/18833

-- 
Edit this bug report at http://bugs.php.net/?id=18833&edit=1

Reply via email to