些細なミスでハマった
ある案件で、FuelPHPを使って開発していた。
ローカルマシンのApacheとMySQLを使った標準のWebアプリ。
ただ、今回はじめてまともにFuelPHPを使ったので、若干なれるのに手間取った。
さて、良い感じに仕上がってきて、本番環境に準備してデプロイすることに。
お客さんがこれまで使っているというSAKURA Internetのレンタルサーバを追加で借りてもらい、設定することに。
SAKURAサーバを使ったことがある人は分かると思うんだけど、MySQLが別サーバになっている。
でもって、契約してあるサーバからしか接続が出来ない仕様。
まぁ、これも理解できる。
そこで、FuelPHPのconfigにあるdb.phpを新規に編集する。
config-----------db.php
+- development--db.php
+- production---db.php
共通の設定などは、config直下のdb.phpに書いておき、開発用、本番用と別々の設定で運用できる。
共通のdb.php
<?php
return array(
'default' => array(
'type' => 'mysqli',
'connection' => array(
'host' => 'localhost',
'port' => '3306',
'database' => 'dbname',
'persistent' => false,
'compress' => true,
),
'identifier' => '`',
'table_prefix' => '',
'charset' => 'utf8',
'enable_cache' => true,
'profiling' => false,
'readonly' => false,
),
);
developmentのdb.php
<?php
return array(
'default' => array(
'connection' => array(
'username' => 'username',
'password' => 'password',
),
),
);
productionのdb.php
<?php
return array(
'default' => array(
'connection' => array(
'host' => 'mysqlxxx.db.sakura.ne.jp',
'username' => 'userxxxx',
'password' => 'passxxxx',
'database' => 'user_dbname',
),
),
);
と、こんな感じの設定になっていた。
まあ、ローカルのテストでは、何も問題なく動作していたので、
本番用の設定を書き足してOverrideすれば問題なく動くはず…。
意味のわからないエラー発生
さて、実際にテストしてみると動かない。
ログを見ると、
Uncaught exception Fuel\Core\Database_Exception: mysqli::real_connect(): (HY000/2002): そのようなファイルやディレクトリはありません
いやいや、別にファイルの読み込みとかしているわけじゃないし…???
ということで、原因を探すも一向に解決しない。
あれやこれや設定を変えてみるが、エラーがなくなることはなく、動作しない。
何かがおかしい…。
そこで、coreにあるフレームワークのソースを読むことに。
fuel/core/classes/database/mysqli/connection.php で起きているので、ここのconnect()あたりを読む。
try
{
if ($socket != '')
{
$port = null;
}
elseif ($port != '')
{
$socket = null;
}
else
{
$socket = null;
$port = null;
}
$host = ($persistent) ? 'p:'.$hostname : $hostname;
// Create a connection and force it to be a new link
if ($compress)
{
$mysqli = mysqli_init();
$mysqli->real_connect($host, $username, $password, $database, $port, $socket,MYSQLI_CLIENT_COMPRESS);
$this->_connection = $mysqli;
}
else
{
$this->_connection = new \MySQLi($host, $username, $password, $database,$port, $socket);
}
すると、接続に使うための変数をチェックしたりして、実際に接続するところでエラーが起きている。
まずは、各変数をechoで出力して確認してみる。
あれれ? $hostだけがnullになっている。これでは接続できない。
でもって、$hostはというと、
$host = ($persistent) ? 'p:'.$hostname : $hostname;
ここで、hostnameを使って設定…。おや?
先程の、db.phpをよく見てみると
'host' => 'localhost', とか、'host' => 'mysqlxxx.db.sakura.ne.jp',
って書いている。
いや、ここは
'hostname' => 'mysqlxxx.db.sakura.ne.jp'
と書かないと、$hostに設定されないじゃないか…。
そう、ミスはここにあった。
hostnameを拾って、hostを作り、このhostに接続する。
設定がなければ、localhostへ接続するはず。
なので、もともとDBがlocalに存在していれば、書き間違えていても動作する。
しかし、外部のdbサーバに接続するためには、正しく書いていないと動作しない訳だ。
初めからソースを見れば早く気づいたかも…
ここにたどり着くのに、約3時間格闘してしまった。
無駄に、設定変えたり、検索したり、テストコード書いたり…。
早くフレームワークのソースを読めば気づいたかもしれない。
無駄な作業をしたから、結果的に気づいたのかもしれない。
この辺りって、因果関係が微妙な気もするが、ソースが有るって素晴らしいな。
ということで、まさかの設定ファイルの書き損じが、思わぬエラーを引き起こしてくれたという、情けない原因だった…。
2度と起こさないためにも、備忘録として記録。
あ〜恥ずかしいミスだ。
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。