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