php / php/php-src

fclose 500ms delay on a listening socket on Windows

Ouverte
#19,696 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Category: Streams OS: Windows Status: Needs Triage
Langage dominant
C
Étoiles
40.4k
Forks
8.2k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

Description

The following code:

<?php
	echo "Stream test\n";
	for ($i = 0; $i < 10; $i++) {
		$s = stream_socket_server("tcp://127.0.0.1:0/", $errno, $errstr);
		$start = microtime(1);
		fclose($s);
		echo sprintf("Closed in %.3f\n", microtime(1) - $start);
	}
	
	echo "Socket test\n";
	for ($i = 0; $i < 10; $i++) {
		$s = socket_create(AF_INET, SOCK_STREAM, 0);
		socket_bind($s, "127.0.0.1", 0);
		socket_listen($s);
		$start = microtime(1);
		socket_close($s);
		echo sprintf("Closed in %.3f\n", microtime(1) - $start);
	}
?>

Resulted in this output:

Stream test
Closed in 0.504
Closed in 0.508
Closed in 0.510
Closed in 0.508
Closed in 0.514
Closed in 0.510
Closed in 0.510
Closed in 0.509
Closed in 0.511
Closed in 0.508
Socket test
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000

But I expected this output instead:

Stream test
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Socket test
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000
Closed in 0.000

The problem dates back since at least PHP 5.4.0 as described [here]. I answered there but just tested with the most recent PHP for the Windows platform and confirmed it.

In short - I think that xp_socket.c/php_sockop_close should not poll a listening socket before closing it.

PHP Version
PHP 8.4.12 (cli) (built: Aug 26 2025 18:04:08) (ZTS Visual C++ 2022 x64)
Copyright (c) The PHP Group
Zend Engine v4.4.12, Copyright (c) Zend Technologies
Operating System

Windows 10 Pro x64

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par xp_socket.c et le chemin php_sockop_close mentionné dans le rapport, puis suivez la manière dont stream_socket_server() ferme un socket en écoute sous Windows. Reproduisez la comparaison de temps sous Windows avec PHP 8.4.12 et examinez les tests de sockets existants afin de trouver un cas de régression approprié. Le travail est terminé lorsque le serveur de flux se ferme sans le délai de 500 ms signalé, tandis que le comportement de socket_close() reste inchangé.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
c, php
Domaine
networking
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.