フレームワークを使ってパフォーマンスに問題があったため、Plain PHPで書き直したという話です。
先日受信したメールの内容を.forward経由でDBを保存するという処理を実装しました。まあ良くある処理なのですが、このシステムではWeb側をCakePHPで実装していたので、メール処理もCakePHPのCLI機能(cakeコマンド)を利用しました。
実際に動作してみて数件程度では問題無かったのですが、負荷試験として短時間に数百件、数千件のメールを受信させると、LAが80程度まで跳ね上がりました。処理自体を見直したり、不要なSQLをカットしたりしたのですが、それほど大きな効果はありませんでした。
これはフレームワークの起動に時間がかかっていると判断し、CakePHPを使わずベタなPHPスクリプトだけで実装してテストすると、同じ負荷をかけてもLAが3-4程度まで落ちました。
timeコマンドで実行時間を計測しても、3-4倍の差がありました。(もちろんPHPスクリプトだけの方が早い)
1 | $ time hoge.php |
実はこういった場面はこれまでも経験していて、Web側では負荷が高い箇所やパフォーマンスが出ない箇所ではフレームワークを使わずに実装することがありました。CakePHPにCLI対応が含まれているとはいえ、CLI環境においてもパフォーマンスが出ないシーンでは、あえてフレームワークを使わないという選択肢は覚えておく必要があります。
ただこういったケースがあるからといって、どんなケースでもフレームワークを全く使わないというのは賢明ではありません。
フレームワークで構築することには多くの利点があり、ある程度習得しているフレームワークであれば、PHPスクリプトだけで開発するよりも生産性や安定性等々で有利です。フレームワーク上で十分に性能が出ている場合はそのままで何ら問題ないです。
このあたりのバランスを保つのが大事なのですが、まずはフレームワークで構築しておいて、問題がある箇所を崩していくというアプローチが単純で良いかと。
今回の場合、フレームワーク上で実装していたものをPHPスクリプトで再実装したので、同じ機能をアプローチを実装しただけなので、短時間で再実装することができました。プロトタイプ的にフレームワークで組むというのも良いかもしれません。
CakePHPのDB設定を参照する
これに関連してミニTipsを。
フレームワーク無しで実装する際でもせめてDBの接続情報くらいは共有しておきたいものです。そこで今回はPHPスクリプトから[app/config/database.php]を参照するようにしました。
app/config/database.phpの情報からDBに接続する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | require_once ( '/path/to/cake/app/config/database.php' ); public function connect() { $db = new DATABASE_CONFIG(); $dsn = sprintf( "dbname=%s user=%s password=%s" , $db -> default [ 'database' ], $db -> default [ 'login' ], $db -> default [ 'password' ]); if ( $db -> default [ 'host' ]) { $dsn .= sprintf( "host=%s port=%d" , $db -> default [ 'host' ], $db -> default [ 'port' ]); } $this ->conn = @pg_connect( $dsn ); if (! $this ->conn) { $this ->log( __FILE__ . ':' . __LINE__ . ' ' . $dsn ); exit ; } } |
コメント (Close):2
- k1LoW 08-05-19 (月) 0:46
-
最近自分の周りでも「CakePHPは重い」と言われていました(個人的にはCakePHPが好きなので開発の規模が合えば必ず使っています)。
重い理由は、主にO/Rマッパー周りだと思っていたのですが、「フレームワークの起動」という考えはなかったです。
その上で上記エントリーのTipsは非常に参考になりました。 - shinbara 08-05-20 (火) 9:06
-
k1LoWさん:
汎用フレームワーク(CakePHPに限らず)はPlainなPHPに比べるとどうしてもオーバーヘッドがありますね。
フレームワークも「手段」でしかないので、k1LoWさんが書かれているようにケースバイケースで使うのが良いですね。:-)
トラックバック:1
- このエントリーのトラックバックURL
- /blog/2008/05/cakephp_framework_to_plain_php.html/trackback
- Listed below are links to weblogs that reference
- CakePHP パフォーマンスが出ない時は、例えばフレームワークを避ける from Shin x blog
- trackback from 浮草の謡 09-09-23 (水) 5:57
-
CakePHPが重過ぎる件について…
Ruby on Rails っぽいPHPフレームワークの
CakePHP: 高速開発 php フレームワーク。
を使ってちょこちょこ管理画面周りを作ってみたりしてるのですが。
ってか、5分でWebアプリが作れるって言うのは真っ赤な嘘ですなwいろいろ組み込もうと思うと結構難しいじゃんかよ…コア……