9

すでにstackoverflowでこれに対する解決策を見つけることができませんでした。他のほとんどの関連トピックは、Apacheが最初に起動せず、このエラーが発生することに関係していました。私の問題は、apacheが実行された後、php /mysqlWebサイトに接続している一部のユーザーが次のエラーを受け取ることです。

PHP Warning:  mysql_connect() [function.mysql-connect]:
[2002] Only one usage of each socket address (protocol/network address/port)
is normally permitted.

これは完全にランダムなようで、Apacheのワーカースレッドを監視すると、通常、新しい接続/要求を受け入れるために使用できるアイドル状態のワーカーがたくさんあります。

私のサイトは、Windows XP SP3、Xampp 1.7.7、クアッドコア、4ギガのRAM、1 TB HD、php/mysqlの仕様で実行されています。

Apache / 2.2.21(Win32)mod_ssl / 2.2.21 OpenSSL / 1.0.0e PHP / 5.3.8 mod_perl / 2.0.4 Perl / v5.10.1

これをなくすために私の構成のいずれかで何を変更する必要があるかについての助けをいただければ幸いです。私はグーグルやXamppフォーラムでさえ調べましたが、ほとんどの人はApacheを起動する前にこの問題を経験しますが、ユーザーがこのエラーを経験しているとき、Apacheは正常に動作しています。

4

6 に答える 6

10

エラーは実際には MySQL からではなく、Windows 自体から発生しています。

接続が閉じられると、接続を閉じている側で、5 つのタプル { プロトコル、ローカル IP、ローカル ポート、リモート IP、リモート ポート} がデフォルトで 240 秒間 TIME_WAIT 状態になります。

この場合、プロトコルは固定です - TCP

通常、ローカル IP、リモート IP、およびリモート PORT も固定されています。したがって、変数はローカル ポートです。

何が起こるかというと、1024 から 5000 の範囲のポートをバインドしない場合に使用されます。つまり、おおよそ 4000 個のポートがあります。それらすべてを 4 分間で使用する場合、つまり、およそ 1 秒あたり 16 回の Web サービス呼び出しを 4 分間行うと、すべてのポートが使い果たされます。それがこの例外の原因です。

つまり、ダイナミック レンジのポートが不足しています。それはおそらく起こってはならないことです。ここでは何人の同時ユーザーを扱っていますか?

リンクされたブログには回避策があります。

  1. レジストリを編集して動的ポート範囲を増やします。
  2. TIME_WAITレジストリの編集により、システムが接続に費やす時間を短縮します。
  3. 少しのコードを実行して、regedit を使用せずに上記のレジストリ編集を行います。

なんと多種多様な回避策!

Visual Studio フォーラムのこの質問も参照してください。

アプリケーションが終了する前に送信され、まだ到着していないすべてのパケットを捕捉するために、ポートはさらに 1 ~ 2 分ロックされます。Winsock API では、ソケット オプション SO_REUSEADDR を設定してこれを解決できます (このオプションは .NET Socket クラスでも設定できます) が、TcpListener は高レベルすぎるため、このオプションを設定できません。

MySQL に接続するための基礎となるコード、または Apache で接続を処理するコードが を使用しようとしていない可能性が非常に高いですSO_REUSEADDR

キープアライブ タイムアウトの変更がここに直接的な影響を与えたに違いありません。これを減らすと理論的にはソケットが解放されますが、Windows はこれに同意せず、ソケットを予約したままにします。

于 2012-12-24T19:12:36.767 に答える
-1

FWIW、同様のセットアップ(Windows XP)で同じ問題が発生しました。Mac (OS X) では、この問題なしで同じコードが機能しました。

MySQLi クラス内で永続的な接続を使用して問題を解決しました。

詳細については、http: //php.net/mysqli.persistconnsを参照してください。

永続的な接続の使用に関連するすべての落とし穴/注意事項を認識していることを確認してください。

于 2013-07-23T12:44:39.130 に答える