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