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