ぶろぐ

日記です

ほげほげ


自分が好きなように書くのが楽しいし、ふるゆわでいいし、今のところ一人でしかコーディングしないし、集団じゃないし、ふわっと入ってががっと没頭出来る時が一番楽しいし、今できる事やり切るのが楽しい!なんかフレームワーク使うのめんどい。
最近思った以上にコーディングに時間使ってないことに気がついた!
一人でにいつかか書き直したいなーTODOを上げると

  • memcacheのKeyって定数切ったほうがいい気がしおる、当たり前か
    • 固定のkey+引数でやっているけどいいかな
  • PDO気持ちい、PDOで十分。だけどSQLだけを別ファイルで書き出したい気がする…!
    • 気持ちS2Daoみたいな感じで
    • あーなんかひらめいた。sqlファイル外に書き出して、file_get_contentsで読み込んでpdo->prepareの引数に渡してあげればいいのでは。daoのメソッド名と紐付けて。よし、ちょっとやってみよ。
    • 自分のmethod名を取得して、それ+.sqlをfile_get_contentsの引数にすることってできないのかな…。
    • ほお、__METHOD__で分かるっぽい。echo __METHOD__; //HogeDao::findById
    • と思ったら、__FUNCTION__のほうが良かった。
    • ってことは、$sql = file_get_contents(__FUNCTION__. '.sql'); でいけるっすね。
    • 共通的な前処理後処理って、何処かでまとめたい。AOPぐらいしか今日は思いつかないけどもっと簡単にできないものなのかな。そんなデザパタありそう。あるなきっと。引数で関数渡してあげればそういうことできそう。
      • 引数に呼ぶdaoを渡すと、memachedに貯めこんでくれる関数あったら便利だと思いませぬか>< 親classでそんなメソッドを用意しといて、daoはそれを継承して呼び出せば捗りそう。
      • 妄想だけど、メソッドの参照先だけを渡せば行けそうっすね。Javaみたいにインターフェース要らないし余裕で行けそう。
      • あれ、どうやるんだろ。リフレクション…?メソッドが固定で1つしかないようなオブジェクトならhoge->run();でいい気がするけど、hoge->findById(); hoge->findByName();とかの呼ぶ変数を動的に変えるにはどうすれば…?関数ポインタ的なことできたっけ…?
      • なんかクラス名とメソッド名でほげほげできるっぽい
      • あるインスタンスのこのメソッドをコールして、というのもありな気がする
      • 明日考えよ…

以下のようにするのも考えたけど、sqlファイルで書きだされていると捗る気がするなー

<?php
// HogeSql.phpの中に
class HogeSql {
    const hogeQuery = <<<EOF
select 
    hoge
from
    hoge
where
    id = ?
EOF;
}

こんなの欲しい

<?php
//妄想コード
abstract class MemcacheUtil {
    function queryCache($dao, $args) {
        $key = __FUNCTION__. '引数をシリアライズ';
        // キャッシュ読みにいく
        $data = $memcache->get($key);
        if(!$data) {
            //TODO: うわ!引数渡さないといけないや。ココどうやるの
            $data = $dao();
           $this->memcache->set($key, $data, false, 30);
        }
        return $data
    }
}

あれだ、このメソッドで実行するsqlファイルと引数もらってquery実行するのもありだなー。
今かいているのって、DBをjsonで操作する為のPHP書いてるだけなので、フレームワークとか要らん。viewとかjson_encode($hoge, true); で終わってしまう。controllerは欲しいけど、1つのcontrollerは1つのphpファイルというところで落ち着かせておいて、daoよんでjson_encodeするだけ。validationは重複するとやなのでdaoの前に一枚modelかまそうかな…と言うぐらい。重複することない気がしてきた、controllerに書こうかな。いや、要るな。DB操作以外にロジックが入ることを忘れていた…(メール飛ばさないといけなかったり、csv出力しないといけなかったり)
なんかガリガリと叩き台書いて、後からリファクタリングするなりして仕上げていったほうがいい気がする…!
router自作したいな…欲しいな…でもいいや。
mod_rewrite使いたかったけど、いまいち言うことを聞いてくれないから諦めたわ…。
ぴよコードっすけどね!
validtionは力技で書くのめんどいな!xUnitでテストしたいな!気が向いたらでいいや!

追記

一応書いたけど、なんか微妙。使ってない

  • 連想配列で結果を返すDaoを自分のインスタンスに持つ
  • そのDaoは配列の引数を持つ
    • その配列の引数はpdo->prepare($bind);的な感じで使う
<?php
/**
 * Daoの結果をmemcacheでキャッシュ
 * @param $dao String 関数名
 * @param $bind array daoの引数に渡すやつ
 */
function queryCache($dao, $bind = null) {

  // 引数bindがあればkeyに加える
  if(is_null($bind)) {
    $memKey = $dao;
  } else {
    $memKey = $dao. implode($bind);
  }

  try {
    if($this->getMemcachedStatus()) {
      $data = $this->m->get($memKey);
    }
    if(!$data) {

      // 引数bindがあればdaoの引数に与える
      if(is_null($bind)) {
        $data = $this->$dao();
      } else {
        $data = $this->$dao($bind);
      }
      if($this->getMemcachedStatus()) {
        $this->m->set($memKey, $data, false, self::memSec);
      }

    }
    return $data;

  } catch (PDOException $e) {
    print(self::messagePdoException);
    error_log(__METHOD__. $e->getMessage());
  }
} 
sqlファイルを読み込む件
<?php
/**
 * ほげほげをIDで検索する
 * @param array($id)  ほげほげID
 */
function findHogeById($bind) {
  $sql = file_get_contents('Model/'.__FUNCTION__.'.sql');
  $memKey = __FUNCTION__. implode($bind);

  try {
    if($this->getMemcachedStatus()) {
      $data = $this->m->get($memKey);
    }
    if(!$data) {
      $stmt = $this->pdo->prepare($sql);
      $stmt->execute($bind);

      $i = 0;  
      while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
        $data[$i] = $row;
        $i++;
      } 
      if($this->getMemcachedStatus()) { 
        $this->m->set($memKey, $data, false, self::memSec);
      } 
    }   
    return $data;
  
  } catch (PDOException $e) {
    print('Error:'. $e->getMessage());
    error_log(__METHOD__. $e->getMessage());
  }   
}

うーん。
更新系クエリ実行をmemcache更新と一緒にしたもの、参照クエリにmemcache参照処理を挟んだもの。両方を用意してクエリ実行時には必ずそれを通すように作れば、安全にmemcacheを使える気がしているんだけどどうなんだろ。
高階関数使えばいいのかな、もっともっとパラメータ化出来るだろ、という感じはしている。

<?php
CacheUtils::queryCache(function($dbh, $bind) {
  $dbh->prepare('select * from hoge where id = ?');
  return $dbh->execute($bind);
}, $bind);
//なんか違うな…
CacheUtils::query('select * from hoge where id = ?', array(1));
//とか

的なことできないのかな。とりあえず眠い。しかしある更新処理を行ったことで、どの参照系クエリに影響が出るのか、って考えるも面倒くさいな…。

なぬ

fetchAll() 使える…!