1

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 のように動作させるにはどうすればよいですか?」ということになるはずです。

4

2 に答える 2

4

TIME_WAIT状態の接続閉じられています。バグや問題はありません。短時間に大量の TCP 接続を作成して閉じると、多数の TCP 接続がTIME_WAIT状態になることになります。

接続を閉じるのではなく再利用するか、これが問題を引き起こしている理由を突き止めて修正する必要があります。たとえば、ローカル ポートの範囲を広げると役立つ場合があります。

TCP 接続の構築と切断にはコストがかかります。1秒間に何十回もやろうとしているのなら、何か非常に間違ったことをしている.

于 2013-02-25T15:00:25.580 に答える
0

MySQLiで永続的な接続を使用する必要があります

ホストの前に p: を追加すると、永続的な接続が開かれます。mysqli_change_user() は、接続プールから開かれた接続で自動的に呼び出されます。

これにより、接続が開いたままになり、使用可能な状態になります。

于 2013-02-25T16:16:53.710 に答える