我在 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 中不要关闭它们。只要有可能,旧连接就会被重新使用。