Edit report at https://bugs.php.net/bug.php?id=64577&edit=1

 ID:                 64577
 User updated by:    davek at gamehouse dot com
 Reported by:        davek at gamehouse dot com
 Summary:            die or exit on solaris leaves open file descriptors
 Status:             Open
 Type:               Bug
 Package:            Apache2 related
 Operating System:   solaris 11
-PHP Version:        5.3.23
+PHP Version:        5.4.13
 Block user comment: N
 Private report:     N

 New Comment:

Resolved:

  Worked with our hosting company, joyent, on this.  It was pointed out that 
they had 
solved this issue about two years ago (https://bugs.php.net/bug.php?id=47675).  
I had 
found that bug report before creating this one as I saw that the code change 
had been 
added. However... 

I didn't see this at first but looking more closely, when I look at my version 
of 
main.c, old_cwd_fd is declared without the 'volatile' modifier.   After reading 
up on 
setjmp/longjmp and the use of volatile, I added it in, re-compiled and the 
issue is 
resolved.   It's clear in bug 47675 that the volatile modifier is there however 
it's 
not been added into the code repository.  Will this be added?


Previous Comments:
------------------------------------------------------------------------
[2013-04-03 21:00:19] davek at gamehouse dot com

I build php 5.4.13 and re-ran the test.  Same result: open FD's accumulate.

------------------------------------------------------------------------
[2013-04-03 19:02:20] davek at gamehouse dot com

this may be related to https://bugs.php.net/bug.php?id=47675 
and https://bugs.php.net/bug.php?id=60978

I'll verify that I can reproduce the issue with php 5.4

------------------------------------------------------------------------
[2013-04-03 18:59:08] davek at gamehouse dot com

Description:
------------
apache 2.4.3 : mod_prefork, keepAlive = Off
php 5.3.23 : ../php-5.3.23/configure' 
'--prefix=/opt/ghc/services/php/php5.3.23' 
'--with-apxs2=/opt/ghc/services/apache/apache2.4.3-php/bin/apxs' '--with-config-
file-path=/opt/ghc/services/php/php5.3.23/lib' '--disable-all'

phpinfo.php:

<?php
phpinfo();
die();


Test script:
---------------
server> ./bin/httpd -X &
server> pfiles $(pgrep httpd) |awk '{print $1}' |grep ^[[:digit:]] |wc -l
12

server> pfiles $(pgrep httpd) 
25087:  ./bin/httpd -X -f /opt/ghc/conf/php_conf/conf/httpd.conf
  Current rlimit: 1024 file descriptors
   0: S_IFCHR mode:0620 dev:533,11 ino:920560006 uid:0 gid:7 rdev:6,1
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/1
      offset:320891
   1: S_IFCHR mode:0620 dev:533,11 ino:920560006 uid:0 gid:7 rdev:6,1
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/1
      offset:320891
   2: S_IFREG mode:0644 dev:90,65567 ino:99347 uid:0 gid:0 size:5322
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
      /opt/ghc/conf/php_conf/logs/error_log
      offset:5322
   3: S_IFSOCK mode:0666 dev:540,0 ino:10 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
        SOCK_STREAM
        SO_REUSEADDR,SO_KEEPALIVE,SO_SNDBUF(49152),SO_RCVBUF(128000)
        sockname: AF_INET 192.168.27.57  port: 80
   4: S_IFDOOR mode:0444 dev:542,0 ino:90 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[9126]
      /var/run/name_service_door
   5: S_IFIFO mode:0000 dev:530,0 ino:21648220 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK FD_CLOEXEC
   6: S_IFIFO mode:0000 dev:530,0 ino:21648220 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
   7: S_IFREG mode:0644 dev:90,65567 ino:97687 uid:0 gid:0 size:0
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE FD_CLOEXEC
      /opt/ghc/conf/php_conf/logs/access_log
      offset:0
   8: S_IFIFO mode:0000 dev:530,0 ino:21648221 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
   9: S_IFPORT mode:0000 dev:543,0 uid:103 gid:1 size:0
  10: S_IFIFO mode:0000 dev:530,0 ino:21648222 uid:0 gid:0 size:0
      O_RDWR


client> curl http://server/phpinfo.php


server> pfiles $(pgrep httpd) |awk '{print $1}' |grep ^[[:digit:]] |wc -l
13

server> pfiles $(pgrep httpd) 
25087:  ./bin/httpd -X -f /opt/ghc/conf/php_conf/conf/httpd.conf
  Current rlimit: 1024 file descriptors
   0: S_IFCHR mode:0620 dev:533,11 ino:920560006 uid:0 gid:7 rdev:6,1
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/1
      offset:324283
   1: S_IFCHR mode:0620 dev:533,11 ino:920560006 uid:0 gid:7 rdev:6,1
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/1
      offset:324283
   2: S_IFREG mode:0644 dev:90,65567 ino:99347 uid:0 gid:0 size:5322
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
      /opt/ghc/conf/php_conf/logs/error_log
      offset:5322
   3: S_IFSOCK mode:0666 dev:540,0 ino:10 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
        SOCK_STREAM
        SO_REUSEADDR,SO_KEEPALIVE,SO_SNDBUF(49152),SO_RCVBUF(128000)
        sockname: AF_INET 192.168.27.57  port: 80
   4: S_IFDOOR mode:0444 dev:542,0 ino:90 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[9126]
      /var/run/name_service_door
   5: S_IFIFO mode:0000 dev:530,0 ino:21648220 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK FD_CLOEXEC
   6: S_IFIFO mode:0000 dev:530,0 ino:21648220 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
   7: S_IFREG mode:0644 dev:90,65567 ino:97687 uid:0 gid:0 size:0
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE FD_CLOEXEC
      /opt/ghc/conf/php_conf/logs/access_log
      offset:0
   8: S_IFIFO mode:0000 dev:530,0 ino:21648221 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
   9: S_IFPORT mode:0000 dev:543,0 uid:103 gid:1 size:0
  10: S_IFIFO mode:0000 dev:530,0 ino:21648222 uid:0 gid:0 size:0
      O_RDWR
  13: S_IFDIR mode:0755 dev:90,65567 ino:21918 uid:0 gid:0 size:22
      O_RDONLY
      /opt/ghc/services/apache/apache2.4.3-php
      offset:0

client> curl http://server/phpinfo.php


server> pfiles $(pgrep httpd) |awk '{print $1}' |grep ^[[:digit:]] |wc -l
14

server> pfiles $(pgrep httpd) 
25087:  ./bin/httpd -X -f /opt/ghc/conf/php_conf/conf/httpd.conf
  Current rlimit: 1024 file descriptors
   0: S_IFCHR mode:0620 dev:533,11 ino:920560006 uid:0 gid:7 rdev:6,1
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/1
      offset:327991
   1: S_IFCHR mode:0620 dev:533,11 ino:920560006 uid:0 gid:7 rdev:6,1
      O_RDWR|O_NOCTTY|O_LARGEFILE
      /dev/pts/1
      offset:327991
   2: S_IFREG mode:0644 dev:90,65567 ino:99347 uid:0 gid:0 size:5322
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
      /opt/ghc/conf/php_conf/logs/error_log
      offset:5322
   3: S_IFSOCK mode:0666 dev:540,0 ino:10 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
        SOCK_STREAM
        SO_REUSEADDR,SO_KEEPALIVE,SO_SNDBUF(49152),SO_RCVBUF(128000)
        sockname: AF_INET 192.168.27.57  port: 80
   4: S_IFDOOR mode:0444 dev:542,0 ino:90 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[9126]
      /var/run/name_service_door
   5: S_IFIFO mode:0000 dev:530,0 ino:21648220 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK FD_CLOEXEC
   6: S_IFIFO mode:0000 dev:530,0 ino:21648220 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
   7: S_IFREG mode:0644 dev:90,65567 ino:97687 uid:0 gid:0 size:0
      O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE FD_CLOEXEC
      /opt/ghc/conf/php_conf/logs/access_log
      offset:0
   8: S_IFIFO mode:0000 dev:530,0 ino:21648221 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
   9: S_IFPORT mode:0000 dev:543,0 uid:103 gid:1 size:0
  10: S_IFIFO mode:0000 dev:530,0 ino:21648222 uid:0 gid:0 size:0
      O_RDWR
  13: S_IFDIR mode:0755 dev:90,65567 ino:21918 uid:0 gid:0 size:22
      O_RDONLY
      /opt/ghc/services/apache/apache2.4.3-php
      offset:0
  14: S_IFDIR mode:0755 dev:90,65567 ino:17614 uid:103 gid:1 size:20
      O_RDONLY
      /opt/ghc/webroots/php_content
      offset:0

Expected result:
----------------
I'd expect that FD's don't leak.

Actual result:
--------------
every call adds another open FD.
I've traced this to main/main.c 2266


PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC)
{
...
...
>            old_cwd_fd = open(".", 0);
...
            VCWD_CHDIR_FILE(primary_file->filename);
...
...
zend_try {
...
 retval = (zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 3, 
prepend_file_p, 
primary_file, append_file_p) == SUCCESS);
} zend_end_try()
...
...
// close old_cwd_fd code
}

-- looks to me that the objective is to move the process into the directory of 
the script.  I thought that moving the close of the FD to right after the move 
[VCWD-CHDIR_FILE()] would cleanup the open FD and it does, However why is this 
happening in the first place?  I ran the same test on my OSX workstation and 
FD's don't accumulate.  



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



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

Reply via email to