2013年8月25日日曜日

Doctine2のEntityをlazy loadさせない

Symfony2標準のDocrine2がクエリを投げるとき、
Entityで外部参照のものがあるときなどで
Entity本体でなくてProxyというオブジェクトが代わりに返ってくるのは、
パフォーマンスのための柔軟性としてそう設計されている、と言いつつ、
気づかないで結構へんな詰まり方をしてしまう。

通常はinner joinを使うことで回避できて、
それは呼び出し側が外部キーのカラムを明示的に持っていればSQLとしてそう書けるのだが、
私がやりたいケースでは、
mappedByという形でアノテーション指定している側()が呼び出し側になってしまい、
そのエンティティだけを読んだ時に全部呼びたいのに、
やっぱりProxyが代わりに読まれてしまうという問題に出くわした。


解決策としては、最終的な処理で初めて全てのSQLが走って本物のオブジェクトが得られるlazy loadではなくて、最初から読むeagerにすれば良い、はずなのだが、

Entityのアノテーション属性のfetchにEAGERと指定する方法

と、

EntityManagerのfetchModeを"EAGER"とする方法

があるようで、
そもそもentityにアノテーションで書いてある場合には、
前者のほうがすっきりするようだった。
もちろん、その分遅くなってしまうというのはあると思うが、
今のところ私の扱っているエンティティは
レコード数、更新はそれほどないようなので、
とりあえずこれで様子を見てみようと思う。

- by Mizuk

2013年8月20日火曜日

centos6 に pecl-memcached

一度やったことをあるのをもう1回やろうとしてやっぱり見事に同じようなところでつまづいて時間がかかってしまったのでメモ!

PHPからmemcachedを使うときのコンポーネントの構成も含め、いちばんうまくまとまっていると思ったのはここ。

http://melikedev.com/2012/06/19/centos-php-install-memcached-with-a-d-stack/


違いといえば、私がやったときは、

./configure

には特に難しいオプションが要らなかった。


あとは、libmemcachedとphp pecl memcachedのバージョンはきちんと対応したのを、
と言っているが、私の場合は、

CentOS6.4
PHP5.3.3

に対し、

libmemcached 1.0.4(libmemcached-1.0.4.tar.gz)
pecl-mecached 2.0.0(memcached-2.0.0.tgz)

libmemcachedのほうは、ここからバージョンを選べるんだけど、
pecl-mecachedのほうはChangelogからたどっていったら、うっかり最新(2.1.0)をDLしてしまって、
インストールしたら
最後にmemcachedが有効になっているかを確認するphp -mを打つたびに、
memcached_server_minor_version in Unknown on line 0
というのが出てきて、まさに前に他の環境でやった失敗を繰り返してしまった。

Available Releasesからでないと指定したバージョンをDLできないよう。




まあmemcached使って何するかというところが
まだ見えてないうちにこういうところで時間かかって
夏ばてとかしてる今日このごろなんですが…


- by Mizuk