关闭流服务器套接字很慢

Uns*_*ned 5 php sockets

经此脚本测试,关闭返回的资源stream_socket_server()非常慢(~0.5 秒):

<?php

echo "Creating socket...";
$s = stream_socket_server("tcp://127.0.0.1:4567");
echo "done\n";

echo "Closing socket...";
fclose($s);
echo "done\n";

?>
Run Code Online (Sandbox Code Playgroud)

90%的执行时间花在fclose($s);

等效的 C++ 应用程序在尝试关闭侦听套接字时不会遇到如此长的延迟,而是在 < 0.03 秒内关闭。是否有特定于 PHP 的配置会影响此问题?

  • 操作系统: Windows 7 x64 旗舰版
  • PHP: 5.4.0(命令行)
  • 配置:默认php.ini

Mik*_*osh 0

好的,

因此,这里发生的情况是,您不仅需要等待应用程序关闭套接字,还需要等待打开的 TCP 套接字在网络层关闭。

当您有一个打开的套接字时,需要来自服务器和对等方的 FIN 才能关闭套接字,或者如果任何一方收到 FIN,则默认超时(大多数为 600 秒,具体取决于设置)。

您可以尝试帮助加快速度的方法是关闭套接字:

stream_socket_shutdown
Run Code Online (Sandbox Code Playgroud)