Merge branch 'PHP-8.1' into PHP-8.2

* PHP-8.1:
  Fix cli server blocking on accept when using multiple workers
This commit is contained in:
Ilija Tovilo 2022-10-20 13:04:25 +02:00
commit ce527ed599
No known key found for this signature in database
GPG key ID: A4F5D403F118200A

View file

@ -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);