diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 9c1a78024c4..ce3ff5de6cb 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -2499,6 +2499,14 @@ static zend_result php_cli_server_ctor(php_cli_server *server, const char *addr, retval = FAILURE; goto out; } + // server_sock needs to be non-blocking when using multiple processes. Without it, the first process would + // successfully accept the connection but the others would block, causing client sockets of the same select + // call not to be handled. + if (SUCCESS != php_set_sock_blocking(server_sock, 0)) { + php_cli_server_logf(PHP_CLI_SERVER_LOG_ERROR, "Failed to make server socket non-blocking"); + retval = FAILURE; + goto out; + } server->server_sock = server_sock; php_cli_server_startup_workers(); @@ -2631,7 +2639,8 @@ static zend_result php_cli_server_do_event_for_each_fd_callback(void *_params, p struct sockaddr *sa = pemalloc(server->socklen, 1); client_sock = accept(server->server_sock, sa, &socklen); if (!ZEND_VALID_SOCKET(client_sock)) { - if (php_cli_server_log_level >= PHP_CLI_SERVER_LOG_ERROR) { + int err = php_socket_errno(); + if (err != SOCK_EAGAIN && php_cli_server_log_level >= PHP_CLI_SERVER_LOG_ERROR) { char *errstr = php_socket_strerror(php_socket_errno(), NULL, 0); php_cli_server_logf(PHP_CLI_SERVER_LOG_ERROR, "Failed to accept a client (reason: %s)", errstr);