« 2010年3月 | トップページ | 2010年5月 »

2010年4月の記事

Windows 7のhostsのデフォルト

  久しぶりにプログラミング言語を触ってます。フリーで整えられる開発環境の充実ぶりに感激しました。こんな玩具が学生時代にあればきっと、授業にも出ず何時間も遊び続けたに違いない。しかしこんな玩具が学生時代になかったのに授業に出なかったのはなぜなのか(またそれか)。

  それはそれとして、LANに繋げてないPCで、PHPからローカルのデータベースに接続できず、かなり悩みました。データベース管理ツールからはつながるのに、PHPでは失敗する。    最初は「SQL懐かしい!」とかわくわくしてたのに、だんだんテンションが落ちてきます。もう全部アンインストールしてふて寝しようかと思った。

  原因は、わかってみれば単純なことでした。専門書やネット検索でうまく解決策が見つからなかったのに、実は公式マニュアルとその追記にすべて書いてあるとわかったときには愕然としてのけぞった。

  さて詳細。きっと検索でたどり着く人もいるだろうということでメモっときます。

2011/01/09追記:公式マニュアルにこの話が載せられていたので、それにあわせました。PHP 5.3.5がリリースされていますが、このバグの修繕有無は未確認です。

【環境】Windows 7でApache2.2とPHP5.3を動かして、PHPからMySQLやPostgreSQLに接続。

【症状】DBへの接続関数を呼ぶとしばらく待たされ、「接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。」というメッセージが出る。エラー番号2002。

【原因】接続関数で指定したホスト名"localhost"が"127.0.0.1"に解決されてない。Windows 7のhostsファイルは、デフォルトではlocalhostの名前解決をするための記述がコメントアウトされてる。

【解決策】

公式マニュアルより
「PHP:PHPの使い方」「Windows で、 "127.0.0.1" だと動作するのに localhost を使うと接続がタイムアウトします。」

<引用>PHP 5.3.4 を使っている場合、その原因は PHP のネットワーク解決に関するコードのバグです。 IPv6 が有効になっている環境では、ストリーム関連のすべての場面で localhost への接続に失敗していました。 回避策は、 "127.0.0.1" を使うようにするか IPv6 の名前解決を hosts ファイルで無効にするかのいずれかです。<引用終わり>

  接続関数が失敗する原因はこの他にも星の数ほどあります。ただ、DB接続関数のホスト名を「localhost」と指定するPHPの解説書が多いため、自宅等でhostsを編集せずにWindows 7を使ってると、今回のこれでつまずきやすいかもしれません。   
  あと、hostsの読み方はホウスツだけど、古い人はホストスと読んでることもある。どうでもよい。

◆名前解決ができてないと動かない一例の一部

//
$hostname = 'localhost'; // '127.0.0.1'とIPアドレスで指定すれば動作する
$username = 'hoge';
$password = 'secret';

$conn = mysql_connect($hostname, $username, $password);

if (!$conn) {
    die('connection failed.'.mysql_error());
}else{
    echo('connection established.');
}
//

 

参考サイト:  
mysql_connect /User Contributed Notes」PHPマニュアル
  ……28-Oct-2009のBruce Kirkpatrick氏の追記がまさにこの話。ちなみに、MySQLへの接続にmysqli()やpearのMDB2:connect()を使った場合にも、postgresqlにpg_connect()を使ってつないだ場合にも同様の問題が起きたこと、これらの関数のリファレンスページにはこの話が書かれてないこともメモっておこう。先にpostgresqlの接続を試してれば、まだ悩んでたかもしれない。

hosts ファイルを規定にリセットして戻す方法」マイクロソフトサポートオンライン 
  ……「リセットする方法」なので、今回の話と直接は関係ありません。Windows 7から、デフォルトでlocalhost行がコメントアウトされてるのがわかります

| | コメント (2) | トラックバック (0)

« 2010年3月 | トップページ | 2010年5月 »