From 6e160ed59101a5ffe45d7027420aa198173186e6 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sun, 9 Oct 2022 00:54:01 +0200 Subject: [PATCH] Fix cli server blocking on accept when using multiple workers Fixes GH-9400 --- sapi/cli/php_cli_server.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index a1fc2cf0f89bb..295448f12111b 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -2441,6 +2441,14 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c 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(); @@ -2581,7 +2589,8 @@ static int php_cli_server_do_event_for_each_fd_callback(void *_params, php_socke 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);