Windowsでlocalhostへの接続が遅い(解決方法)
WindowsでApache+PHP+MySQLで動作するWEBアプリを作成していて気がついたのだが、
どうやら、localhostに接続するのが遅いケースがあるようだ。
テスト環境は次の通り。
OS 名 Microsoft Windows 7 Professional
バージョン 6.1.7600 ビルド 7600
システムの種類 x64-ベース PC
プロセッサ Intel(R) Core(TM) i5 CPU 660 @ 3.33GHz、3334 Mhz、2 個のコア、4 個のロジカル プロセッサ
インストール済みの物理メモリ (RAM) 12.00 GB
Apache 2.2.16
MySQL Server 5.1 64bit
PHP Version 5.3.9
CakePHPのブログチュートリアルに載っている単純な方法を試していると、
5件しかデータが入っていないTableの表示に1秒以上かかる。
変なので各所を調査してみた。
- 次の箇所に入れた実行時間計測で遅い値が出た。
public function index() {
$stime=microtime(true);
debug("start $stime");
$this->set('posts', $this->Post->find('all'));
$etime=microtime(true);
debug("end $etime " . sprintf("%f",$etime-$stime));
}
この find(‘all’) にかかる時間が 1.056782(s)だった。
-
コマンドプロンプトのmysqlコマンドでselect * from posts を実行するとすぐに結果が返る。
-
phpMyAdminでSQLを発行すると、遅い。
-
CakePHPのサンプルアプリ一式をCentOS環境下においた場合は特に問題なく、すぐに結果が返る。
phpMyAdminでも遅い。試しにCakePHP app/Config/database.phpのDB設定でhostの設定を
’localhost’から'127.0.0.1’ にしてみた。
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
//'host' => 'localhost',
'host' => '127.0.0.1',
'login' => 'testuser',
'password' => 'testpass',
'database' => 'testdb',
'prefix' => '',
//'encoding' => 'utf8',
すると、find(‘all’) にかかる時間が 0.014920(s)になった!
また phpMyAdmin/config.inc.php も’localhost’から'127.0.0.1’ にしてみた。
//$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
なんとかなり速くなった。。
いままで数年、この設定だったのだが。。ああ。。
根本的な原因はWindwosのlocalhostの名前解決が遅いことにあるのかもしれない。
XP時代には感じなかったので、Windows Vistaや7などのせいかもしれない。
時間があったら調査してみよう。
追)
どうやら、Windows VistaやWindows7のlocalhostのIPv4,IPv6接続の優先度が影響している模様。
c:\windows\system32\drivers\etc\hosts ファイルで
# 127.0.0.1 localhost
# ::1 localhost
の定義になっている場合、IPv6が優先されてしまい、IPv6でListenしていないアプリへの接続は、その後のIPv4での接続を待ってしまう模様。
127.0.0.1 localhost
# ::1 localhost
として、IPv4のlocalhostアドレスを有効にしたところ、localhostへの接続がIPv4優先となり、ホスト名にlocalhostを利用しても遅くならなかった。
※IPv6の「 ::1 localhost」はコメントにしておくこと。
関連
ブラウザでlocalhostに繋がらない。hostsファイルが影響?