Archive for the ‘php’ Category

    はてなブックマーク - CakePHPでのSQLのログ
    このエントリーをはてなブックマークに追加

    Fusicの中野です。

    表題のとおり、CakePHPのログに関する小ネタを紹介します。
    ちなみに、使っているCakePHPのバージョンは1.3です。(CakePHP2.xなんて知りません)

    CakePHPでConfigure::read(“debug”) > 1の場合は画面にSQLのログが表示されます。
    ですが、運用中ではPHPのエラー表示などがされないように、Configure::read(“debug”) == 0の状態ではないかと思います。
    そうなると、すこしだけSQLの確認をしたいときなどちょっと面倒ですよね。

    CakePHPはConfigure::read(“debug”) > 1の場合、SQLのログはDboSourceの_queriesLogというメンバの配列に格納されていて、どうやらその配列の中身を画面に出力しているようです。

    そこで、こいつの中身が取れれば解決できるので・・・

    $db =& ConnectionManager::getDataSource($Model->useDbConfig);
    $db->fullDebug = true; // ここがfalseだとログを保存しない。$db->fullDebug = Configure::read() > 1みたいになってます。
    $db->_queriesLogMax = 200; // SQLがこの件数こえると配列に保存しないよ的なもの。

    みたいなことをfindを実行する前に書いてあげれば、_queriesLogに登録されるようです。

    だけど、これだと少々めんどいのでBehaviorにまとめてみましょう。

     
    class QueryLogBehavior extends ModelBehavior {
      var $__settings = array();
      var $_queriesLogMax = 999;
     
      function setup( &$Model, $settings = array() ){
       $this->__settings[ $Model->alias ] = array();
     }
     
      function make_query_key( $Model, $query ){ return get_class( $Model ) . "__" .  md5( serialize( $query ) ); }
      function add_query( $key ){
        return "'" . $key . "' = '" . $key . "'";
      }
     
      function beforeFind( &$Model, $query ){
        if( array_key_exists( "log", $query ) and $query["log"] ){
          $db =& ConnectionManager::getDataSource($Model->useDbConfig);
          $db->fullDebug = true;
          $db->_queriesLogMax = $this->_queriesLogMax;
          $key = $this->make_query_key( $Model, $query ); // いらないかも。
          if( array_key_exists( "conditions", $query ) ){
            $query["conditions"][] = $this->add_query( $key );
          }
          else {
            $query["conditions"] = array( $this->add_query( $key ) ); 
          }
          $this->__settings[$Model->alias][] = array( $key, $query["log"] );
        }
        return $query;
      }
     
      function afterFind( &$Model, $results, $primary ){
        $db =& ConnectionManager::getDataSource($Model->useDbConfig);
        $db->fullDebug = Configure::read() > 1;
        $db->_queriesLogMax = 200;
     
        $hit_sql = null; $level = LOG_DEBUG;
        foreach( $this->__settings[$Model->alias] as $keypair ){
          list( $key, $level ) = $keypair;
          foreach( $db->_queriesLog as $index => $query_log ){
            if( preg_match( "/^(.*)" . $this->add_query( $key ) . "(.*)$/", $query_log["query"], $regexp )) {
              $hit_sql = $regexp[1] . "" . $regexp[2];
              break;
            }
          }
        }
        if( !is_null( $hit_sql ) ) $this->log( $hit_sql, $level );
        return true;
      }
    }

    なんかこんな風に適当にBehaviorを追加して

    $this->Hoge->find( "all", array( "contain" => array(), "conditions" => <なんかの条件>, "log" => LOG_INFO ) );

    みたいにしてあげたら、app/tmp/log/debug.logにSQLが記述されます。これで任意のfindの処理のSQLをログにだしたりできます。
    データベースの設定でSQLのログだしとけよとかいうツッコミはなしで。

      はてなブックマーク - PHPMatsuriはFusicのプラスになったのか?(4/4)
      このエントリーをはてなブックマークに追加

      どうやら最終区担当の小山です。

      FusicのPHPMatsuri2011 レポートも最後です。何やらハードルが上がっているように見えますが、そこはスルー力を発揮します。

      PHPMatsuriリレーブログで「FusicがPHPMatsuriに参加すべき意義」というエントリーを書きましたが、「実際はどうだったのか?」について考えてみたいと思います。

      PHPMatsuri前

      前のエントリーはどちらかというと自分個人の考えが強かったのですが、あるとき弊社社長からこんなメールが社内に送信されました。

      “今、気付いたけど、小山君がいいこと書いてました。

      blog.fusic.co.jp/archives/1869

      PHP Matsuri に参加する方々、ぜひ何かを感じて
      帰って来て下さい。”

      会社としても4人を送り込むわけですから、期待しないわけにはいかないです。
      ただ、この時点では4人ともそこまで意気込んではいなかったのではないでしょうか。

      はたしてPHPMatsuriで何を感じたのか

      「PHPMatsuriで何かを感じることができたのか」

      それは今までの3回のエントリーを見ていただければ一目瞭然でしょう。

      傍から見ていても違いが分かるほどです。

      例えば、先日CakePHP2.0のリリースがありましたが(おめでたい!)、
      今まで以上に社内で話題になっているように感じました。
      CakePHP界隈の人の話題もでるようになりました。

      では、「具体的に何が変わったのか」、自分なりに分析してみたいと思います。

      会社の外をより意識するようになった

      PHPMatsuriをはじめとして勉強会やカンファレンスで、最も良い効果のひとつがこれだと思います。
      さらにPHPMatsuriはハカソンイベントです。

      会社の外の人と同じ環境で開発できる

      これができるイベントはなかなかありません。
      ネットを通じて一つのプログラムを開発するのもかなりエキサイティングな体験ですが、
      実際に同じ場所で、いつもと違った人と一緒に開発するのはさらに刺激的です。

      ちなみにこの体験はかなり中毒性があるらしく、PHPMatsuriにリピータが多いことからもそれが証明されているのではないでしょうか。

      ライブラリを「使う」意識から「作る」意識により傾いた

      何かのシステムを作るとき、目指す目標は「システムを完成させること」です。
      ただ、その目の前の目標だけを追っていたら毎回同じように苦労するでしょう。

      「システムを完成させること」と同時に
      「次のシステムでも使えるような機能に」「いつか別のシステムでも使えるような機能に」
      「どこかの誰かが使えるような機能に」
      という意識を持つことで、次のシステムを作るとき楽になるかもしれませんし、
      そういう意識を持つことが結果的にソースコードが綺麗になることにつながります。

      なかなか日々の業務に追われていたら変えたい意識もなかなか変わることはできませんが、
      PHPMatsuriではフレームワークの開発者やライブラリの開発者が一堂に会しています。
      その人たちの考えに少しでも触れることができます。
      むしろ触れずにはいられない環境です。

      さらに「次の日のLT大会」のための、業務でない「何かを」作ります。
      多分PHPMatsuriに行く前の、開発ネタを考えるときから何かを得られたのではないでしょうか。

      プログラムの世界を楽しめた

      何で括ればいいか良い言葉を思いつきませんでしたが、
      PHPMatsuriはPHPやJavaScriptをはじめとした「プログラムを通じて楽しむ環境」だったように思います。
      プログラムの世界を楽しむことができれば、
      35年定年説なんて関係ないでしょうし、日々の仕事も楽しくなることうけあいです。

      PHPMatsuriに行くことを決めた時点でいつも楽しめているんでしょうが、
      PHPMatsuriに参加したことで、いろんな人と交流ができて、さらに楽しむ術を覚えたように思います。
      この楽しみがもっと増えればいいなと思っています。

      結論

      当初のもくろみ以上にPHPMatsuriはFusicのプラスになった

      4人がそれぞれ精一杯過ごせたと思います。
      フレームワークのコアデベロッパに相談したり(貴重!)、
      ハッカー精神よろしくアグレッシブすぎるものを開発したり、
      会社の外の人とはじめて一緒に開発する環境を体験したり、
      さらには全員が最後に成果を発表できて、
      確実にプラスになっています。

      PHPMatsuri青年団の皆様、この場を借りて御礼をいいたいと思います。

      本当にありがとうございました!

      来年

      来年のことを言うと鬼が笑うので、あまり考えないようにしていますが、
      来年もPHPMatsuriが開催されて欲しいと思っています。
      ただ、PHPMatsuriを開催するのに多大な労力がかかっていることも知っています。

      もし来年PHPMatsuriが開催されるなら、
      そのための協力はできる限りしていきたいなと思っています。

      ちなみに

      自分は今年はこんなものを作成していました。
      ハッカー賞次点をいただきました!ありがとうございます!

      何が一番面倒かって仕様が複雑すぎで実装に先が見えないことです。

        はてなブックマーク - PHP Matsuri 2011に参加して得たこと(3/4)
        このエントリーをはてなブックマークに追加

        3区担当の杉本です。
        PHP Matsuri
        でのハッカソンは10/16に終わりましたが、弊社ではまだマラソンが続いています。

        「ブログを書くまでが”Matsuri”」

        ※リレーブログ形式になったのは初日の誰かさんのせいですね。

        PHP Matsuriについて

        今回、初めてPHP Matsuriに参加しました。また、ハッカソンというのも初めての経験でした。
        コアデベロッパーの方やお世話になっているライブラリの開発者の方にお会いできるのを楽しみにしていました。

        Matsuriでは過ごし方を手探りしながら、初日は講演とワークショップに参加して、日付が変わったところから開発を始めました。
        ただ、もう少しいろんな方とお話しすればよかったなと今は思っています。

        デモ大会での発表について

        ハッカソンでは「CakePHPのbakeで確認画面(添付画像付き)含めたソースを楽して一括生成する」というテーマで参加しました。

        弊社ではCMSや業務系システムなどの案件が多く、「確認画面(添付画像付き)」という要件も少なくありません。
        これが結構面倒な処理になるのですが、「TransitionComponent(hiromi2424さん)」と「FilebinderPlugin」を使うことでかなり簡単に実装ができるようになりました。ほんと感謝感謝ですm(_ _)m
        それぞれのライブラリの使い方については割愛させていただきますが、色々な方が詳しく解説されていますので是非調べてみてください。
        ※弊社ブログでも過去にTransitionComponentについての記事が書かれています。

        ただ、それでも案件毎に、モデル毎に同じ処理を書くのが面倒になってきました。

        「もっと楽に、簡単に、ミスがないように」

        実装するために、確認画面ありのCRUDをbakeを使ってソースを生成したいと思うようになりました。

        そこで、CakePHP1.3+から導入されたTemplatesを使って、コアのbakeをいじらず、実装することにしました。
        今回は即実践投入を考えて、まずはCakePHP1.3で開発。

        CakePHP Templatesについて

        Templatesはcakeディレクトリにあるtemplates/default一式をappにコピーして作っていきます。
        Controller/Modelについてはソースを見れば、修正は簡単でしたが、
        課題はCRUDの4ファイル以外のctpファイルをどう生成するか、でした。

        Matsuriに参加するまではコアのbake周りをいじらないといけないかと思っていましたが、cakephperさんに相談したところ、コアデベロッパーのグラハムさんに直接質問できる機会ができ、templatesを使って任意のctpファイルを生成するサンプルコードを教えてもらい、見事解決しました。

        ちょっと緊張しましたが、グラハムさんとお話ができたこの瞬間が一番楽しかったです。(でもやっぱり英語勉強しないといけませんね。。。)
        本当にMatsuriに参加してよかったです。

        CrudPlusPluginについて

        ブログを書きながら(思いつきで)名前を決めました。
        使い方はapp/pluginsディレクトリに置いてbakeするだけ。

        php cake/console/cake.php bake all

        該当するモデルを選ぶところはいつもと同じです。異なるのは最後にテンプレートを指定するところです。

        ---------------------------------------------------------------
        You have more than one set of templates installed.
        Please choose the template set you wish to use:
        ---------------------------------------------------------------
        1. confirm_with_file
        2. default
        Which bake theme would you like to use? (1/2)
        [1] > 1

        これでadd.ctp/edit.ctp/index.ctp/view.ctpに加えて、add_confirm.ctpも同時に生成されます。今回のハッカソンでは時間が足りず、edit_confirm.ctpまで作れませんでした。
        あと改善したいのはTransitionComponent/FilebinderPluginの存在チェックをして、なければ取得・設置できるような処理を入れたいと考えています。
        近いうちに仕上げて、GitHubで公開します。

        最後に

        今回、目標の一つにCakePHP2.0を学ぶというのを掲げていました。年内にはstableが出るだろうから年明けにはガンガン使い出すという雰囲気でしたので。
        ところが福岡に帰ってきてみると、いつの間にかリリースされているというお土産つき!
        CakePHPワークショップ中にバグを直すという(予期しない)”イベント”があったので、まるで自分が開発チームのような、一緒に2.0をリリースしたような気分に勝手になっていました。
        これはただの妄想ですが、いつも使っているフレームワークやライブラリを開発している方と直に話をすることで、さらにこのフレームワークやライブラリが好きになりました。
        これは今回得たものの中でも予想外のことでした。

        今回このような素晴らしい機会に恵まれたことに感謝しています。
        そして、PHP Matsuriのスタッフの方にはこの場を借りてお礼を言いたいと思います。本当にありがとうございました。

        さて明日は最終走者、弊社小山です。
        初日の安藤さんや吉岡さんのように、熱く”Matsuri”を語って、このリレーマラソンを締め括ってくれると思います。
        みなさん、期待しておいてください。

        それではまたどこかで。