PHP Mysqli 不关闭 TCP 连接

Sim*_*rts 1 php connection mysqli tcp

我正在更新我的脚本以从 ext/mysql 移动到 ext/mysqli。它引入了一些问题。

\n\n

在 ext/mysqli 下,脚本终止时不会释放连接。

\n\n

这些脚本都是从命令行运行的。没有 Apache 或其他 HTTP 参与。

\n\n

由于业务原因,我有时需要进行大量的单数据库交互。它们不是同时活动的,每个操作(INSERT、UPDATE、SELECT、DELETE)在下一个操作开始之前完成。\n在某些情况下,我能够构建大型单个查询(例如 UPDATE...SET... CASE...WHEN 等),当然,这些都不是问题,因为它们使用较少的连接,但有时我无法使用此选项。

\n\n

我$mysqli->close()在每次数据库操作后都有一个,但(TCP)连接不会关闭。脚本终止后,连接将保持打开状态,直到超时(如 \xe2\x80\x9cnetstat -an\xe2\x80\x9d 所示)。

\n\n

对我来说,实际意义是我的 TCP 连接已经用完。

\n\n

这些脚本与 ext/mysql 完美配合。

\n\n

之前已将此报告为错误 ( http://bugs.mysql.com/bug.php?id=38107 ),但解决方案是升级到 PHP 5.3。我正在使用 5.3.8。

\n\n

例子:

\n\n
$mysqli = new mysqli(DB_SERVER, DB_SERVER_USERNAME,DB_SERVER_PASSWORD, DB_DATABASE)         or die ("Unable to connect: " . $mysqli->error());\n$result = $mysqli->query($query) or die ("Query failed: " . $mysqli->error . " Actual query: " . $query);\n// Do domething interesting with $result\n$mysqli->close();\n/** TCP connection remains open until it times out at an OS level /**\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有人遇到过这个问题并找到解决方案?谢谢。

\n\n

注意:Stackoverflow 上还有其他类似但不相同的问题。请不要将其作为重复项关闭。

\n\n

更新:我可能找错了树。我认为这是连接问题的原因是因为我收到此错误:\n mysqli::mysqli(): [2002] Only one usage of each socket address (protocol/network address/port) is normally permitted.\n我在这里找到的解释(http://www.online-it-support.co.uk/?p=652)建议 TCP 端口原因是疲惫。\n我可以更改我的开发环境,因为它在我的控制范围内。生产环境不是。\n我认为(也许不明智)这是不正确的行为。这是基于 ext/mysql 不会出现问题的事实。\n也许我的问题应该是“如何使 ext/mysqli 的行为像 ext/mysql?”。

\n

Dav*_*rtz 5

处于TIME_WAIT关闭状态的连接。没有错误或问题。如果您在短时间内创建并关闭大量 TCP 连接,则最终会出现大量处于状态的 TCP 连接。TIME_WAIT

您要么需要重新使用连接而不是关闭它们,要么找出导致问题的原因并修复它。例如,增加本地端口的范围可能会有所帮助。

建立和拆除 TCP 连接的成本很高。如果你试图每秒执行数十次,那么你就做错了。