ソケット(socket)ファイルとは
ソケットファイルとはUNIX系OSのプロセス間通信で使用されるファイルである。
特徴:
・ソケットファイルを用いることでサーバー/クライアント間のプロセス間通信をファイルを通じて行うことができる。
・ファイルを使用する為、サーバー/クライアントが同一ホストの場合に限られる。
・ソケットファイルを用いるとTCP/IP接続と比べ、高速な通信が可能となる。
【localhost】と【127.0.0.1】の違いについて
【localhost】はソケットファイルを使用した接続が行われるが、【127.0.0.1】では、TCP/IPを利用した接続が行われます。
では、Mysqlの接続について確認してみましょう
コマンドラインでmysqlに接続
下記のコマンドラインで設定を確認してみます
$php --ri mysqli mysqli MysqlI Support => enabled Client API library version => mysqlnd 5.0.11-dev - 20120503 - $Id: f373ea5dd5538761406a8022a4b8a374418b240e $ Active Persistent Links => 0 Inactive Persistent Links => 0 Active Links => 0 Directive => Local Value => Master Value mysqli.max_links => Unlimited => Unlimited mysqli.max_persistent => Unlimited => Unlimited mysqli.allow_persistent => On => On mysqli.rollback_on_cached_plink => Off => Off mysqli.default_host => no value => no value mysqli.default_user => no value => no value mysqli.default_pw => no value => no value mysqli.default_port => 3306 => 3306 mysqli.default_socket => /tmp/mysql.sock => /tmp/mysql.sock mysqli.reconnect => Off => Off mysqli.allow_local_infile => On => On
上記により、デフォルトは/tmp/mysql.sockのソケットファイルを使用することが分かりました。
実際にサンプルを作成して確認してみます。サンプル 名はmysqli.phpにする。
<?php //定義 $host = 'localhost'; $username = 'fuel_dev'; $password = 'tammulodo'; $database = 'fuel_dev'; $port = '3306'; $socket = ''; //mysqliクラスのオブジェクトを作成 $mysqli = new mysqli($host, $username, $password, $database, $port, $socket); //エラーが発生したら if ($mysqli->connect_error){ print("接続失敗:" . $mysqli->connect_error); exit(); } print("接続に成功しました\n"); //切断 $mysqli->close();
コマンドラインで実行
$ php -f mysqli.php 接続に成功しました
上記のサンプルにより、ホスト名は【localhost】を指定し、ソケットファイルを使用してmysqlに接続することが確認出来ました。
Webブラウザからmysqlに接続
上記のサンプルをFuelPHPの実行フォルダにコーピーし、実行すると下記のエラーが発生しました。
Webサーバーからmysqlに接続する時、TCP/IP経由で接続する必要がある為、ホスト名が明示に【127.0.0.1】を指定しなければなりません。
では、上記のサンプルにホスト名を”localhost”から"127.0.0.1"に変更して、再度実行してみると、正常に接続することが出来ました。
まとめ
コマンドラインでmysqlに接続する時、ソケットファイルを使用しても、TCP/IP経由してもmysqlに接続することが出来ますが、Webブラウザからmysqlに接続する時、TCP/IP経由で接続する必要があるので、ホスト名が明示に指定しなければなりません。
> Webサーバーからmysqlに接続する時、TCP/IP経由で接続する必要がある為、
返信削除> ホスト名が明示に【127.0.0.1】を指定しなければなりません。
> では、上記のサンプルにホスト名を”localhost”から"127.0.0.1"に変更して、
> 再度実行してみると、正常に接続することが出来ました。
ここからが面白いところだから、掘り下げてみようよ。なぜダメなのか。どこがこかしているのか。
ざっと見た感じだと、MySQLのクライアントでは成功しているので、以下のどれかでは? とアタリをつける、など。
- php binding of MySQL (mysqli) : PDOなら? mysqlなら?
- FuelPHPのModelのMySQL基底
逆の方に行くなら、
- MySQLのどこで"localhostならソケット処理"に切り替えてるのか、