PHP-Mysqli没有关闭TCP连接


PHP Mysqli not closing TCP connections

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

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

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

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

每次DB操作后,我都有一个$mysqli->close(),但(TCP(连接不会关闭。脚本终止后,连接将保持打开状态,直到超时(如"netstat-an"所示(。

对我来说,实际的含义是我的TCP连接即将耗尽。

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

这以前被报告为一个错误(http://bugs.mysql.com/bug.php?id=38107)但解决方案是升级到PHP 5.3。我用的是5.3.8。

示例:

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

有人经历过这个问题并找到了解决方案吗?谢谢

注意:关于Stackoverflow还有其他类似的问题,但不一样。请不要将此作为副本关闭。

更新:我可能找错树了。我之所以认为这是一个连接问题,是因为我收到了以下错误:mysqli::mysqli(): [2002] Only one usage of each socket address (protocol/network address/port) is normally permitted.我在这里找到的解释(http://www.online-it-support.co.uk/?p=652)表明TCP端口耗尽是原因。我可以对我的开发环境进行更改,因为它在我的控制范围内。生产环境不是。我认为——也许是不明智的——这是不正确的行为。这是基于这样一个事实,即ext/mysql不会出现问题。也许我的问题应该是"如何让ext/mysqli表现得像ext/mysql?"。

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

你要么需要重新使用你的连接,而不是关闭它们,要么弄清楚为什么这会给你带来问题并解决它。例如,增加本地端口的范围可能会有所帮助。

建立和拆除TCP连接的成本很高。如果你试图一秒钟做几十次,那你就大错特错了。

您应该在MySQLi 中使用持久连接

通过p准备主机:打开持久连接。在打开的连接上自动调用mysqli_change_user((来自连接池。

这应该会使连接处于打开状态,处于可用状态。