private function fork(&$socket): int
    {
        $pair = [];

        $domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);
        if (\socket_create_pair($domain, SOCK_STREAM, 0, $pair) === false) {
            $error = socket_strerror(socket_last_error($pair[0] ?? null));

            $this->logger->error('{type}: unable to create socket pair; ' . $error, $this->logContext);
            exit(0);
        }

        // Fork child worker.
        $pid = pcntl_fork();
        if ($pid === -1) {
            throw new RuntimeException('Unable to fork child worker.');
        }

        if ($pid !== 0) {
            // MASTER
            $this->childProcesses++;

            $socket = $pair[0];
            socket_close($pair[1]);

            // wait up to 10ms to receive data
            socket_set_option(
                $socket,
                SOL_SOCKET,
                SO_RCVTIMEO,
                ['sec' => 0, 'usec' => 10000]
            );

            return $pid;
        }

        $socket = $pair[1];
        socket_close($pair[0]);

        register_shutdown_function($this->handleChildErrors($socket));

        return $pid;
    }
private function fork(&$socket): int
    {
        $pair = [];

        $domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);
        if (\socket_create_pair($domain, SOCK_STREAM, 0, $pair) === false) {
            $error = socket_strerror(socket_last_error($pair[0] ?? null));

            $this->logger->error('{type}: unable to create socket pair; ' . $error, $this->logContext);
            exit(0);
        }

        // Fork child worker.
        $pid = pcntl_fork();
        if ($pid === -1) {
            throw new RuntimeException('Unable to fork child worker.');
        }

        if ($pid !== 0) {
            // MASTER
            $this->childProcesses++;

            $socket = $pair[0];
            socket_close($pair[1]);

            // wait up to 10ms to receive data
            socket_set_option(
                $socket,
                SOL_SOCKET,
                SO_RCVTIMEO,
                ['sec' => 0, 'usec' => 10000]
            );

            return $pid;
        }

        $socket = $pair[1];
        socket_close($pair[0]);

        register_shutdown_function($this->handleChildErrors($socket));

        return $pid;
    }
private function fork ( & $ socket ) : int { $ pair = [ ] ; $ domain = ( strtoupper ( substr ( PHP_OS , 0 , 3 ) ) == 'WIN' ? AF_INET : AF_UNIX ) ; if ( \ socket_create_pair ( $ domain , SOCK_STREAM , 0 , $ pair ) === false ) { $ error = socket_strerror ( socket_last_error ( $ pair [ 0 ] ?? null ) ) ; $ this -> logger -> error ( '{type}: unable to create socket pair; ' . $ error , $ this -> logContext ) ; exit ( 0 ) ; } // Fork child worker. $ pid = pcntl_fork ( ) ; if ( $ pid === - 1 ) { throw new RuntimeException ( 'Unable to fork child worker.' ) ; } if ( $ pid !== 0 ) { // MASTER $ this -> childProcesses ++ ; $ socket = $ pair [ 0 ] ; socket_close ( $ pair [ 1 ] ) ; // wait up to 10ms to receive data socket_set_option ( $ socket , SOL_SOCKET , SO_RCVTIMEO , [ 'sec' => 0 , 'usec' => 10000 ] ) ; return $ pid ; } $ socket = $ pair [ 1 ] ; socket_close ( $ pair [ 0 ] ) ; register_shutdown_function ( $ this -> handleChildErrors ( $ socket ) ) ; return $ pid ; }
Forks and creates a socket pair for communication between parent and child process

@param  resource $socket
@return int PID if master or 0 if child

@throws RuntimeException
Forks and creates a socket pair for communication between parent and child process