PHP Mysqli 不关闭 TCP 连接

标签 php tcp mysqli connection

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

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

脚本都是从命令行运行的。不涉及 Apache 或其他 HTTP。

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

我在每次数据库操作后都有一个 $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] 通常只允许每个套接字地址(协议(protocol)/网络地址/端口)使用一次。 我在这里找到的解释 ( http://www.online-it-support.co.uk/?p=652 ) 表明 TCP 端口耗尽是原因。 我可以更改我的开发环境,因为它在我的控制范围内。生产环境不是。 我假设——也许是不明智的——这是不正确的行为。这是基于 ext/mysql 不会出现该问题的事实。 也许我的问题应该是“如何使 ext/mysqli 的行为像 ext/mysql 一样?”。

最佳答案

TIME_WAIT 状态下的连接关闭。没有错误或问题。如果您在短时间内创建和关闭大量 TCP 连接,您将在 TIME_WAIT 状态下结束大量 TCP 连接。

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

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

关于PHP Mysqli 不关闭 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15069631/

相关文章:

javascript - 使用javascript获取行数

PHP MySQLi 从 multi_query() 插入 id

php - 我在字符串连接线解析错误: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in [closed]中遇到此错误

php - 如何在 Swift 3 中将值作为 NSDictionary 获取?

node.js - ZMQ 发布/订阅订阅

c - Unix Socket 发送/接收长消息

php - 如何从 mySQL 数据库表中获取具有特定答案的数据到 php 输出中

javascript - PHP 相当于 JavaScript 的parentNode 属性

php - 使用 PHP 将 iOS 客户端连接到 MySql 数据库的最佳方法是什么?

java - 为什么在文件服务器程序套接字中写入 "Socket s =null"?