go to bug id or search bugs for
The use of pcntl_signal(SIGCHLD, SIG_IGN) breaks sleep(). In 7.0 the below script would sleep for 60 seconds then exit, in 7.1 the script does not sleep at all.
Sleep for 60 seconds, print 'Done' and exit.
Instantly prints 'Done' and exist.
Add a Patch
Add a Pull Request
Sorry, the test script is incorrect. It should be:
$pid = @pcntl_fork();
if ($pid == -1)
exit(pcntl_get_last_error() . ': ' . pcntl_strerror(pcntl_get_last_error()));
elseif ($pid == 0)
This also creates a <defunct> process when pcntl_signal(SIGCHLD, SIG_IGN) should have removed it.
This bug exists because ZEND_SIGNALS was defaulted to "yes" with PHP 7.1. The problem with this is that sleep() will sleep for the number of seconds, OR, is interrupted by a signal that is not ignored.
With your test script with pcntl_signal(SIGCHLD, SIG_IGN), you're instructing PHP to ignore the end of a child. However, ZEND_SIGNALS, zend_sigaction() sets the set handler into the SIGG(handlers), but, will set the actual signal handler to zend_signal_handler_defer, which is not SIG_IGN. As such, during the sleeping, when a SIGCHLD is raised, sleep bails because it is not "ignored" at the system level, and ends up calling zend_signal_handler_defer which will not process the signal.
I believe a safe fix would be to in zend_sigaction, only set the defer handler IF the incoming sigact's handler is not SIG_IGN. Will make a PR and see if it's acceptable or not.
Would this also fix the issue where pcntl_signal(SIGCHLD, SIG_IGN) no longer stops <defunct> threads from remaining until the main process has ended? In 7.0 threads would exit cleanly, but since upgrading to 7.1 they all sit as <defunct> now.
I would assume as much, I wasn't directly able to replicate the <defunct> process. I tried on both my Debian setup & MacOS 10.12, which both lack the <defunct> but do both sleep correctly with the fix in place.
The output I get with PHP 7.1, and my fix are as follows:
dwalker@linux:~/src/php PHP-7.1 › time sapi/cli/php e.php && ps aux | grep defunc
dwalker 24037 0.0 0.0 12784 940 pts/3 S+ 08:38 0:00 grep --color=auto defunc
dwalker@linux:~/src/php fix-73783 › time sapi/cli/php e.php && ps aux | grep defunc
dwalker 16683 0.0 0.0 12784 900 pts/3 S+ 08:37 0:00 grep --color=auto defunc
Related To: Bug #71437
Automatic comment on behalf of email@example.com
Log: Fixed bug #73783