Azure MySQL 应用内:通常只允许使用每个套接字地址一次

Azure MySQL 应用内:通常只允许使用每个套接字地址一次

我在 Azure 上运行一个应用服务,其中包含一个 PHP 应用程序和一个 MySQL 应用内数据库。此应用服务收到大量小请求(例如获取或更新游戏排行榜)。

我经常在 PHP 应用程序的日志文件中看到以下警告:

PHP Warning:  mysqli_connect(): (HY000/2002): Only one usage of each socket address (protocol/network address/port) is normally permitted.

我收到几位玩家的投诉,称他们无法更新排行榜上的分数,我认为这是因为在日志中经常看到此警告。我追踪到这个问题是因为在操作系统层面上,连接处于 TIME_WAIT 状态的时间太长,或者可以使用的端口范围太小,无法处理更多连接。

我如何在 Azure 上进行调整,以便此警告消失或频率大大降低?我使用close()mysqli 对象上的函数来清除连接,但据我正确理解,这不会立即释放操作系统中的底层资源。

提前致谢!

答案1

问题在于 TCP/IP 连接关闭的方式:

  • 你要求关闭连接(FIN),
  • 服务器确认已收到你的请求 ( ACK),并要求关闭其端 ( FIN),
  • 你承认(ACK)并等待4 分钟TIME_WAIT状态)以确保服务器发送的数据包不会因网络延迟而到达。在此期间,您不能使用同一端口连接到服务器。

mysqli可能使用了多个源端口,但即使使用了所有端口,限制也大约是每秒 270 个连接。

要解决您的问题,请启用持久连接在 PHP 中不要关闭它们。只要有可能,旧连接就会被重新使用。

相关内容