php+mysql の開発プロセス中、データベースに接続するためのホスト名を入力する場合、ローカル マシンは通常、localhost または 127.0.0.1 を使用できますが、実際のアプリケーション プロセスでは Linux システムに異常は見つかりませんでした。 Windows サーバー システムでは、localhost を記述すると、Web ページの応答が比較的遅くなり、ページが完了するまでに 1 秒以上かかります。プログラムの実行時間を段階的に判断したところ、問題があることがわかりました。 mysql に接続するとき、接続を確立するのに 1 秒近くかかります。問題がある場合は、この状況が存在することを確認してください。その抜粋は次のとおりです。
HTTP://blog.Sina.com.abilities/是/blog_6cost 5ah 76 毛 0100 一枚絵.HTML
最近、プログラムの応答時間が少し遅いことに気づき、それを徐々に排除し、各プログラムの実行時間を計算しましたが、最終的にはデータベースへのリンクに時間がかかることがわかりました。データベースがあったので、それを置きました。
翌日、データベースへのリモート リンクをテストしたところ、IP を使用してデータベースにアクセスする場合の実行時間は非常に短く、localhost を使用してデータベースにローカルに接続する場合よりもはるかに短いことがわかりました。したがって、次のテストがあります。
set_time_limit(0) ; $localtime = 0 ; for($i=1;$i<=50;$i++){ $btime = get_microtime() ; $conn = new mysqli("localhost","root","admin","") ; $conn-close() ; $etime = get_microtime() ; $localtime += $etime-$btime ; } $iptime =0 ; for($i=1;$i<=50;$i++){ $btime = get_microtime() ; $conn = new mysqli("127.0.0.1","root","admin","") ; $conn-close() ; $etime = get_microtime() ; $iptime += $etime-$btime ; } echo "localhost时间损耗为:".($localtime)/$i."<br /" ; echo "127.0.0.1时间损耗为:".($iptime/$i)."<br /" ; function get_microtime(){ list($micro,$time) = explode(" ",microtime()); return $time+$micro ; }
出力結果は次のとおりです。 localhost の時間損失は 0.98833055122226 です。
127.0.0.1 の時間損失は次のとおりです: 0.0039590807522044
2 つの接続方法の所要時間は大きく異なります。この質問に答えられる専門家がいれば幸いです。
おそらく DNS 解決が原因か、ローカルホストの解決に時間がかかるのではないかと推測しました。 ウィンドウ システムを使用していることを説明してください。
理由の説明:
これは確かにオペレーティング システムの解析の問題です。詳細については、http://www.cnblogs.com/hayywcy/p/5341550.html を参照してください。
今日、localhost にアクセスすると、「404 が見つかりません」というメッセージが表示されましたが、127.0.0.1 にはアクセスできました。最終的に、Windows が localhost を 127.0.0.1 ではなく ipv6 アドレス::1 に解決したため、その理由が判明しました。ホストを確認したところ、ipv6 がブロックされていることがわかりました。127.0.0.1 localhost もありますが、正常に解析できません。 Baidu は長い間検索しましたが無駄でした。最終的に、科学的なインターネット手法を使用して Google で解決策を見つけました。元の投稿が失われないように、ここに再投稿しました (元の投稿アドレス: http://superuser.com/questions/)。 436574/ipv4-vs-ipv6-windows-7 の優先順位-7/436944#436944)。
記事の内容:
解決策 1: IPV6 よりも IPV4 アドレスを優先するプレフィックス ポリシーを追加する プレフィックス ポリシー テーブルはルーティング テーブルに似ており、接続時にどの IP アドレスが優先されるかを決定します。プレフィックス ポリシーの優先順位が高いほど、「優先順位」が高くなります。ルーティング テーブルの「コスト」値とは正反対の値です。
デフォルトの Windows プレフィックス ポリシー テーブル:
C:\netsh Interface ipv6 show prefixpolicies アクティブ状態をクエリしています...
優先順位 ラベル プレフィックス
---------- ----- ------------------------ ---
50 0 ::1/128
40 1 ::/0
30 2 2002::/16
20 3 ::/96
10 4 ::ffff:0:0/96
5 5 2001::/32 IPv6 アドレス (::/0) が IPv4 アドレス (::/96、::ffff:0:0/96) よりも優先されることに注意してください。 。
Hurricane Electric IPv6 トンネルがどの IPv4 アドレスよりも不利になるポリシーを作成できます。
netsh Interface ipv6 add prefixpolicy 2001:470::/32 3 6 2001:470::/32 は Hurricane Electric のプレフィックス、3 は優先順位 (非常に低い)、6 はラベルです。
より汎用的なプレフィックスを使用することもできましたが、ISP から直接 IPv6 接続を取得した場合に、それが IPv4 よりも優先されることを確認したかったのです。
このソリューションを適用する場合は、Hurricane Electric のプレフィックスの代わりに適切な IPv6 プレフィックスを使用する必要があります。
解決策 #2: レジストリを調整して、Windows が常に IPV6 よりも IPV4 を優先するようにする
このソリューションはより汎用的ですが、侵襲性が高く、標準への準拠性も低くなりますが、最終的には Windows がプレフィックス ポリシー テーブルを変更します。
RegEdit を開き、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters に移動します。 DisabledComponents DWORD レジストリ値を作成し、その値を 20 (16 進数) に設定します。
このレジストリ キーの詳細については、特に DisabledComponents がシステムに存在する場合は、Microsoft KB 929852 を参照してください。
翻訳によると、Windows には優先解析リストがあり、ipv6 が ipv4 よりも高い場合、今日遭遇した状況が発生します (ただし、その理由はまだ見つかっていません)。 1 つ目の方法は、ipv6 よりも高い ipv4 の優先度を持つレコードを優先度解析テーブルに追加することです。理解できない単語が多く、パラメーターを間違えるのが怖いため、あえて使用しません。 2番目のレジストリを変更する方法で解決しました。方法は次のとおりです(英語がわからない場合は確認する必要はありません)。
レジストリを開き、キー HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters を見つけて、DisabledComponents という名前の DWORD 型の項目を追加します (既に存在する場合は、それを追加して値を直接変更する必要はありません) )。次に、値を 20 に変更し、値のタイプを 16 進数に変更します。以上です、レジストリを保存してコンピュータを再起動します。 localhost にもう一度 ping を実行してみてください。