XDebugを有効化したときのメモ

chromeにextensionを追加する


  • インストール先
    Xdebug helper

  • インストールされたextensionのアイコンを右クリック -> オプションを選択する
    IDE keyの項目を、使っている開発環境に合わせる


PHPの環境を作る



[PHP_XDEBUG]
report_zend_debug = 0
zend_extension = "C:\home\php\xdebug\php_xdebug-2.5.0-5.6-vc11-x86_64.dll"
xdebug.remote_enable=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp

  • 設定が行えたか確認する

php -r "phpinfo();" | grep -i debug



ゴルフ初心者が室内練習でお勧めのグッズはコレ(DAIYA:スイング525)



ゴルフがうまくなりたくて良い練習道具を探していたのですが、フォームの練習にピッタリだと思ったので購入したのがダイヤというメーカが作っているスイング525という練習器具です。

ずっと拒んでいたゴルフをどうしてもやらなければいけなくなり、仕方なく始めたのですが、ゴルフスコアがなかなか良くなりませんでした。自分でもフォームが悪い事は分かっていたのですが、どうしたら良いのか分からずにいました。スウィングフォームで検索をしているうちにこの商品にたどり着きました。

室内で練習できるのが便利


部屋の中で練習できる道具を探していたので、自分にピッタリでした。
やはり、思い立った時に家の中で練習できるのは理想的です。また、商品レビューでもとても良い評価だったので、迷うことなく購入を決めました。

一人練習を行うときは、良いか悪いかのフィードバックが大事


商品の説明で正しいフォームを音が導いてくれるとの事でしたが、使ってみてその良さが良く分かりました。間違ったフォームだと変な場所で音が鳴るので直ぐに分かります。今までの自分のフォームは間違っていたのだと再認識しました。やはり音が鳴るのがポイントでとても分かりやすいのです。



 



[FuelPHP]複数DBへ接続時、エラー”Database type not defined in”が出るときにチェックする事

FuelPHPでは、DBへの接続定義を, fuel/app/config/$ENV/db.phpで管理されています。

インストール直後の開発環境では、以下のようになってます。

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

これを、複数DBへの接続対応するために、例えば’default2’を定義したうえで…

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

    'default2' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=fuel_dev2',
            'username'   => 'root',
            'password'   => 'root',
        ),
    ),    
);

以下の形でSQLを発行してもエラーになってしまいます。

$sql = 'select * from tbl_test';
\DB::query($sql)->execute('default2');

出力されるエラーは下記の通りです。

Fuel\Core\FuelException [ Error ]:
Database type not defined in "default2" configuration or 
"default2" configuration does not exist

fuel/core/classes/database/connection.php @ line 72

上記のエラーが発生する理由は、default以外のdb定義をする場合にはtypeの設定が必要なためです。
以下のような感じで'type' => 'pdo',の指定を追加すれば、エラーが解消されました。

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

上記のエラーが出ていた、fuel/core/classes/database/connection.phpの72行目を見ると、確かにtypeの定義がない時にエラーになっています。

if ( ! isset($config['type']))
{
    throw new \FuelException('Database type not defined in "'.$name.'" configuration or "'.$name.'" configuration does not exist');
}

それでは、defaultの時のtypeはどこで指定されているのでしょうか?
調べてみると、fuel\core\config\db.phpで指定が行われているようでした。
ここに、DB検索を実行時にデータソースを指定しなければdefaultの定義が有効になる事と、default定義のtypeはpdoであることが記載されています。

return array(

    /*
     * If you don't specify a DB configuration name when you create a connection
     * the configuration to be used will be determined by the 'active' value
     */
    'active' => 'default',

    /**
     * Base PDO config
     */
    'default' => array(
        'type'        => 'pdo',
        'connection'  => array(
            'dsn'        => '',
            'hostname'   => '',
            'username'   => null,
            'password'   => null,
            'database'   => '',
            'persistent' => false,
            'compress'   => false,
        ),
        'identifier'   => '`',
        'table_prefix' => '',
        'charset'      => 'utf8',
        'collation'    => false,
        'enable_cache' => true,
        'profiling'    => false,
        'readonly'     => false,
    ),
    ...



[FuelPHP]Windowsだと問題ないのにLinux上だとClass not foundエラーが出るときにチェックすること

Windowだとクラスのロードが問題なく行えるのに、Linux上だとクラスのロードでエラーになる場合は、ファイル名の大文字・小文字のルールが間違っている可能性が高い(主に開発環境はWindowsで本番環境がLinuxだと気づきにくい)。

例えば、Model/ItemMst.phpという名前でモデルを作っている場合、Windowsだとファイル名の大文字小文字を無視するのでphpファイルの読み込みが行えるが、LinuxだとModel/itemmst.phpを読みに行こうとしてエラーになってしまう。

newで指定されだクラス名に対して、実際に何のファイル名でクラスローダがロードを試みているか確認したい場合は、Autoloader::load()の最後当たりにある下記の処理にデバッグログを差し込んでみるとわかりやすい。

[fuel\core\classes\autoloader.php]


class Autoloader
{
    public static function load($class)
    {
        ...

        if ( ! $loaded)
        {
            $path = APPPATH.'classes'.DS.static::class_to_path($class);
error_log("load class[{$class}] -> path={$path}\n" , 3, "/path/to/log.txt");
            if (is_file($path))
            {
                static::init_class($class, $path);
                $loaded = true;
            }
        }


FuelPHPでのログ出力はLogクラスを利用して、Log::info(“message”);などで出力できるが、上記の処理はクラスローダ処理なので、Logクラスを使えないことに注意が必要。もし、事情期のログ出力でLogクラスを使用すると、Logクラスの生成でさらにload()メソッドが呼ばれ…、となり想定しないふるまいになってしまう。