読者です 読者をやめる 読者になる 読者になる

【fuelphp】MySQL接続エラー[HY000/2002]と[Call to undefined function Fuel\\Core\\mysqli_init]

はじめに

今更感のある内容ですがけっこうハマったのでメモしておきます。
環境としてはAwsのEC2をWebサーバーにRdsをDBサーバーとする構成で
Webサーバーにはmysql-serverをインストールしていない状況です。

mysql-clientはWebサーバーにインストール済みでmysqlコマンドでの接続は確認できていて、
phpからの接続ができない状態でした。

Call to undefined function Fuel\\Core\\mysqli_init

まず出たエラー内容は以下

Call to undefined function Fuel\\Core\\mysqli_init

Awsにphp5.6が入っていてfuelphpからmysqlに接続できずに出たエラー

yumのログを見るとmysql周りのモジュールがインストールされた記録がないのでおそらくまとめてインストールしたときに見逃したのかもしれない、、、

// yumのログを確認するがログがない
grep -i "mysql" /var/log/yum.log*

// mysqlndをインストール
yum install -y php56-mysqlnd

とりあえずこれでエラーは解消されましたが次のエラーが出ました。

HY000/2002エラー

Uncaught exception Fuel\Core\Database_Exception: mysqli::real_connect(): (HY000/2002): そのようなファイルやディレクトリはありません

よく出るエラーのようです
php.iniの以下を

mysql.default_socket=
mysqli.default_socket=
pdo_mysql.default_socket=

my.confの以下と合わせないとダメとの記事を見かけたので試してみるも上手くいかず、、、

[mysqld]
socket=/var/lib/mysql/mysql.sock

原因(オチ)

mysqliとpdoでconfig/db.phpの記述形式が違うことを知りませんでした

config/db.php

修正前(エラー)

return array(
    'default' => array(
        'type'  => 'mysqli',
        'connection'  => array(
            'dsn' => 'mysql:host=localhost;dbname=fuel_dev'
            'username' => 'username',
            'password' => 'password',
        ),
    ),
);

※type = pdoの場合はこの書き方でOK

修正後

return array(
    'default' => array(
        'type'  => 'mysqli',
        'connection'  => array(
            'hostname' => 'hostname',
            'username' => 'username',
            'password' => 'password',
        ),
    ),
);

別のプロジェクトでpdoを使っていて、今回はmysqliを使おうとしたのですが書き方が違うんですね、、、
勉強になりました

以上です