OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

Doctrine2 四方山話 ( Fetch mode, Index by, Criteria について)

はじめまして。4月からオトバンクで働き始めました @kalibora と申します。よろしくお願いします。

さて、オトバンクでは Symfony2 を使っており、ORマッパーにはデフォルトの Doctrine2 を使用しているのですが、 そんな中で私が得た知見をいくつか紹介したいと思います。

Fetch mode の話

Doctrine2 には fetch mode という概念があります。

Annotations Reference - Doctrine Object Relational Mapper (ORM) を見ますと Doctrine2には下記の fetch mode があるようです。

fetch mode 定義できる場所
EAGER @ManyToOne @ManyToMany @OneToOne @OneToMany
LAZY @ManyToOne @ManyToMany @OneToOne @OneToMany
EXTRA_LAZY @ManyToMany @OneToMany

この fetch mode は、あるエンティティをリポジトリから取得した際に、 関連するエンティティも同時に取得するかどうか?という挙動に関わってくるものです。

ちなみに何も明示的に定義しないと、デフォルトは LAZY な挙動になります。 すなわち、関連エンティティは取得しません。関連エンティティが必要になった時に自動でデータベースにクエリが走り、取得されます。

使わない(参照されない)関連エンティティも毎回取得してしまうと無駄なので、これは理にかなった挙動だと思います。

ところが、LAZY だけを使っていると、いわゆる n+1 問題と呼ばれる問題に直面します。

続きを読む

複数バージョンの PHP をインストールして使う

こんちは!@riaf です。

最近、 php5.x と php7.0 向けの開発を並行してやっているので、OSX 上で複数の PHP をインストールして開発しています。

ついうっかり composer update なんてものを実行してしまったので、その待ち時間でどういう構成にしているか、という記事でも書いてみようかと思いました。

こういった場面では、よく phpenv を使う方法が紹介されますが、内部的に rbenv を使っていたり、そもそも言語ごとに *env 用意すんのかよ..とか、ちょっと気に食わないところがあって、これまでは Vagrant を使ってアプリ毎に異なる環境を用意したりしていました。

しかし去年の秋頃から、MacBook (12インチのやつ) を使うようになったので、Vagrant で VM 立てて、環境切り替えて、、というのが若干ヘビーで、バッテリーで戦いたい時にはちょっと辛くなってきていたので、新たな作戦を考えることにしました。

ここでは

  • phpenv は出来れば使いたくない
  • アプリケーション毎に PHP のバージョンを指定したい
  • ウェブサーバーは PHP のビルトインウェブサーバーで OK

という条件を満たしたいということにします。

さて、まず複数の PHP を用意するところですが、そこはまあ、php-build で良いでしょう。 例えば ghq を使っていれば、

ghq get php-build/php-build
ghq look php-build
./install.sh

とするだけでセットアップできますね。

OSX を使っていて、大雑把にバージョンを指定出来れば良いのであれば、Homebrew/homebrew-php でも良いかもしれません。 複数バージョンをインストールするときにはすでにインストールしてある php を unlink すれば良いので、楽チンです。

あとはアプリケーション毎にバージョンを指定出来れば目的達成ですね。 PHP の実行はシェルで行っているので、環境変数 PATH を切り替えられれば良さそうです。

ということで、みんな大好き direnv を使います。 OSX + Homebrew ユーザーなら brew install direnv で一発ですね!

アプリケーションのディレクトリで direnv edit . して、

追記: PATH_add を使ったほうがいいですね!詳しくはコメントを!

# php-build 使ってるとき
PATH=$HOME/.php/{PHPのバージョン}/bin:$PATH

# homebrew-php 使ってるとき
PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"

のようにしてやれば OK ですね!

おまけ

まっさらな OSX 環境で php-build を実行すると openssl が無いとか libjpeg が無いとか、ビルドが毎回こけてはライブラリを入れて、再度実行、の繰り返しでだいぶ消耗します。

今後の自分のためにも、(不要なものもあるかもしれないけど) 事前にやっておくと幸せになれるコマンドを貼っておきます。

brew install autoconf automake bison re2c libjpeg libpng libmcrypt libxml2
brew link --force libxml2 openssl

Xdebug が重い!それなら PHPDBG で CI を高速化だ〜!

こんにちは、毎度おなじみ @riaf です。ここのところ、私しかブログ記事を書いていませんが、社員が居ないわけではありません。きっとそのうち書いてくれると信じています (まじ、誰かホントに書いてくれよ...)。

今日はタイトル通り、PHP7+PHPUnit4.8 から PHPDBG でのカバレッジ出力がサポートされているので、これまで CI でのカバレッジ出力に時間かかってしまって辛かった部分を解消したいと思います。

準備するものはこちら!

  • PHP7
  • CircleCI (当ブログおなじみ!や、別に CircleCI である必要はないですよもちろん)

つまり、circle.yml

machine:
    php:
        version: 7.0.4

と書き、

test:
    override:
        - phpdbg -qrr vendor/bin/phpunit --coverage-html $CIRCLE_ARTIFACTS/coverage

こんな感じで PHPDBG を使うようにしてあげるだけでした。(もっとボリュームのあるブログになる予定だったのに!)

CircleCI にはあらかじめ phpdbg がインストールされているので、その他に必要な準備もなくあっさりと解決しました。

カバレッジを出力した後は、php-coveralls とか使って Coveralls にまとめてもいいし、$CIRCLE_ARTIFACTS の下に html を置いてもいいし (上の例)、好きにすればいいですね。

というわけで、PHP7 を前提にした記事を書きましたが、来月に札幌で開催される OSC 北海道で PHP のお話をすることになりました。やることがなくてどうしようもないようでしたら、ぜひ遊びに来てみてください!