モンスター・ラボでエンジニアやっています。
社内では、[キンシャサの奇跡]と呼ばれています。
最近、PHPの案件が多いのでフレームワークに[CodeIgniter]を使ってます。
個人的にはCakePHPが好きなんですが、どーもCodeIgniterはベンチマークが
かなり素敵らしい。確かにCakePHPが軽いかと言われると、うーんって感じですが。
とにもかくにも、このフレームワークは自由度がそうとう高く、
好きなようにカスタマイズできちゃうので、設計できない人が
ベースを作るととんでもないことになりそうな感じです。
まあとりあえず軽いという触れ込みでつかってみましたが、
意外なとこで驚かされました。
アプリをガツガツ作って、テストもガンガンやって
これでモウマンタイ!と思って検証サーバにあげた瞬間に。。。。
動かない。。。
サクサク動いていたはずが、処理が遅くなり、そのうちまったく動かなくなりました。
どのくらい動かないかというと[土俵際の千代の富士]くらい動きません。
自分くらいのお年頃になると大抵見当がつきますが、とりあえずデバック。
検証したら案の定DBつかんじゃってるみたいです。
よくあるんですよね、こーいう事。
でも設定ってどこでやるんだろ?と思ったのですが
http://delaz.org/user_guide_ja/database/configuration.html
すんなり載ってました。
CodeIgniterのサイトはとてもマニュアルがわかりやすいです。
よくよく見てみると、[autoinit]の項目に以下の文章が
=========引用======================
autoinit - ライブラリがロードされたときに、データベースに自動的に接続するかどうか。
もし FALSE に設定された場合、最初のクエリの実行の前に接続されます。
=====================================
素敵すぎる!つまり共通関数をライブラリ化して、javaのServiceクラスっぽく作っていた
箇所が全部悪影響したわけですね。
>設計できない人が
>ベースを作るととんでもないことになりそうな感じです。
要は自分の事だったわけですね。
そりゃ、controllerでロードしまくってますよ、ライブラリ。。。
ただ、ゴリっとしちゃうのも嫌なのとライブラリ時に接続する意味がまったくわからないので
autoinit = FALSE
にしました。そしたらすんなりサクサクです。
何の為の設定かな。コネクションプーリング的な動きはしていなそうだし。
しばらく動かしていたら、[コネクションつなぎすぎですよー]と
DB君が、日記のようにログに記録していました。
うーん、まだ何かあるのかな。
ふたたびマニュアルを確認。
=========引用======================
pconnect - TRUE/FALSE (boolean) - 永続的な接続を使うかどうか。
=====================================
何だ永続的な接続って。。。やっぱプーリングしてるのかな。
いろいろ調べたらmodelロード時に接続をするらしい。
何か南、イライラしてきた。
とりあえず、1テーブル1モデル的なRails風のActiveRecord設計にしたのが
間違いっぽい。
pconnect = FALSE
にしたら無事に解消。
負荷テストかなりかけても問題なしでした。
CodeIgniterの設計思想を把握していないが、モジュール化や
ライブラリ化という思想ではなく、Facade的な概念なのかな。
共通処理とか集約したいと思っている自分には、慣れるまで時間がかかりそう。
やっぱりフレームワークは思想を理解してからじゃないと
素敵な作りにはならないのですな。
ちなみに今回設定したパラメータ
[autoinit][pconnect]はCodeIgniter2系ではデフォルトTRUEのようなので
ちゃんと意味わからない人はFALSEにすることをお勧めします。
負荷的には問題なかったので。
また何か発見したら書きますー。