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ファイルが影響?