我正在更新我的脚本以从 ext/mysql 移动到 ext/mysqli。它引入了一些问题。
在 ext/mysqli 下,脚本终止时不会释放连接。
这些脚本都是从命令行运行的。没有 Apache 或其他 HTTP 参与。
出于业务原因,我有时需要进行大量的单数据库交互。它们不是同时活动的,每个操作(插入、更新、选择、删除)在下一个开始之前完成。在某些情况下,我能够构建大型的单个查询(例如 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] 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?”。