- Notifications
You must be signed in to change notification settings - Fork8k
Closed
Description
Description
The following code:
<?phpini_set('display_errors','1');ini_set('display_startup_errors','1');error_reporting(E_ALL);// store processes in an array as [$pid => $process, ...]$processes = [];// catch signals from child processes and unset processes from the arraypcntl_async_signals(true);pcntl_signal(SIGCHLD,function($sig,$info)use (&$processes) { unset($processes[$info['pid']]);},false);// open 10 processes and store them in an arrayforeach (range(0,10)as$i) {$process =proc_open('echo $$', [],$pipes);// prints the pid to STDOUT$pid =proc_get_status($process)['pid'];$processes[$pid] =$process;}// wait for all processes to exitwhile(true) {echo' processes remaining:' .count($processes) .PHP_EOL;if (empty($processes)) {break; }sleep(1);}// Check that all processes have been removed.var_dump($processes);
Resulted in this output:
921922 processes remaining:9925926924 processes remaining:8923 processes remaining:6931929927 processes remaining:5928930 processes remaining:2 processes remaining:2 processes remaining:2 processes remaining:2 processes remaining:2 processes remaining:2 processes remaining:2 ...
But I expected this output instead:
837838 processes remaining:10842840 processes remaining:8 processes remaining:7846841 processes remaining:6847 processes remaining:5 processes remaining:4839843 processes remaining:3844 processes remaining:1845 processes remaining:0array(0) {}
There were some rare cases where the script would exit with code 255 with no errors.
root@c09c0fa26c4d:/app# php test.php933934936 processes remaining:8937935 processes remaining:7938939941 processes remaining:5940942943root@c09c0fa26c4d:/app# echo $?255
PHP Version
PHP 8.2.7 (cli) (built: Jun 13 2023 23:05:53) (NTS)
Operating System
Debian GNU/Linux 12