ID: 44217 Comment by: duane at e164 dot org Reported By: exe at travian dot org Status: Open Bug Type: Filesystem function related Operating System: GNU/Linux Kernel 2.6.18 PHP Version: 5.2.5 New Comment:
The solution to stopping this output is rather simple. After you close the stdin/stdout/stderr open 3 new file descriptors to /dev/null and all output goes bye bye. eg. fclose(STDIN); fclose(STDOUT); fclose(STDERR); $fp1 = fopen('/dev/null', 'r'); $fp2 = fopen('/dev/null', 'w'); $fp3 = fopen('/dev/null', 'w'); Previous Comments: ------------------------------------------------------------------------ [2008-02-25 11:54:22] exe at travian dot org I'd expect php to discard every output after STDOUT is closed, instead of doing a silent exit (which is hard to track because no error handler or shutdown function is called). Another option (if output in this situation is considered to be an error) would be to trigger a warning/fatal and/or call the shutdown function. This would, at least, make it possible to track this issue. I have to close STDOUT and STDERR in a daemonized processes to detach from the controlling terminal. ------------------------------------------------------------------------ [2008-02-24 00:40:01] [EMAIL PROTECTED] Another bug #44218 describes some more expected behaviour caused by closing the input/output streams. NOTE: Correct manual page: http://www.php.net/manual/en/wrappers.php.php ------------------------------------------------------------------------ [2008-02-24 00:34:08] [EMAIL PROTECTED] That's quite expected since you're still trying to output to STDOUT. Why do you want to close STDOUT anyway? See also: http://www.php.net/wrappers.php ------------------------------------------------------------------------ [2008-02-22 17:32:15] exe at travian dot org Description: ------------ If STDOUT and/or STDERR are closed, output by the php script cause the interpreter to exit immediately. According to strace output, php tries to write to the closed STDOUT file handle, causing a "Bad file descriptor" error and exit of the interpreter: [...] close(1) = 0 [...] write(1, "foo", 3) = -1 EBADF (Bad file descriptor) close(0) = 0 close(2) = 0 [...] exit_group(0) = ? Process 19177 detached Reproduce code: --------------- <?php fclose(STDOUT); print "foo"; sleep(10); ?> Expected result: ---------------- No output, php sleeping for 10 seconds. Actual result: -------------- php exits immediately, strace shows an "Bad file descriptor" on the write() try to STDOUT: [...] read(3, "<?php\nfclose(STDOUT);\n\nprint \"fo"..., 8192) = 51 read(3, "", 4096) = 0 read(3, "", 8192) = 0 close(3) = 0 munmap(0x2b1dce200000, 4096) = 0 close(1) = 0 munmap(0x2b1dce202000, 4096) = 0 write(1, "foo", 3) = -1 EBADF (Bad file descriptor) close(2) = 0 close(0) = 0 munmap(0x2b1dce201000, 4096) = 0 munmap(0x2b1dce1bf000, 266240) = 0 mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b1dce1bf000 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 munmap(0x2b1dce1bf000, 266240) = 0 brk(0xd36000) = 0xd36000 exit_group(0) = ? Process 19196 detached ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=44217&edit=1