关闭流服务器套接字较慢。

5

关闭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";

?>

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

相应的C++应用程序关闭监听套接字不会遇到这么长的延迟,而是在<0.03秒内关闭。是否有PHP特定的配置影响了这一点?

  • 操作系统:Windows 7 x64 Ultimate
  • PHP版本:5.4.0 (cli)
  • 配置:默认的php.ini

无法在PHP 5.3.10上重现。请发布您的操作系统,PHP版本和配置。 - igorw
我能够在Ubuntu 12.04,PHP 5.3.10-1ubuntu3.1和Suhosin-Patch上以大约1.4秒的速度执行该脚本100次。 - sarnold
fclose在win 7 64位,php 5.4 rc2上大约需要0.5秒的时间。 - goat
@chris - 我的情况和你类似,时间线也差不多。明显比前面的评论者要长得多。我有一种感觉,这可能与操作系统/PHP组合有关... - Unsigned
1个回答

0

好的,

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

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

你可以尝试使用以下方法来加快速度:

stream_socket_shutdown

在使用stream_socket_shutdownfclose时,无论使用哪种关闭标志组合,我都没有看到任何性能改进。 - Unsigned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接