フレームワークを使ってパフォーマンスに問題があったため、Plain PHPで書き直したという話です。
先日受信したメールの内容を.forward経由でDBを保存するという処理を実装しました。まあ良くある処理なのですが、このシステムではWeb側をCakePHPで実装していたので、メール処理もCakePHPのCLI機能(cakeコマンド)を利用しました。
実際に動作してみて数件程度では問題無かったのですが、負荷試験として短時間に数百件、数千件のメールを受信させると、LAが80程度まで跳ね上がりました。処理自体を見直したり、不要なSQLをカットしたりしたのですが、それほど大きな効果はありませんでした。
これはフレームワークの起動に時間がかかっていると判断し、CakePHPを使わずベタなPHPスクリプトだけで実装してテストすると、同じ負荷をかけてもLAが3-4程度まで落ちました。
timeコマンドで実行時間を計測しても、3-4倍の差がありました。(もちろんPHPスクリプトだけの方が早い)
実はこういった場面はこれまでも経験していて、Web側では負荷が高い箇所やパフォーマンスが出ない箇所ではフレームワークを使わずに実装することがありました。CakePHPにCLI対応が含まれているとはいえ、CLI環境においてもパフォーマンスが出ないシーンでは、あえてフレームワークを使わないという選択肢は覚えておく必要があります。
ただこういったケースがあるからといって、どんなケースでもフレームワークを全く使わないというのは賢明ではありません。
フレームワークで構築することには多くの利点があり、ある程度習得しているフレームワークであれば、PHPスクリプトだけで開発するよりも生産性や安定性等々で有利です。フレームワーク上で十分に性能が出ている場合はそのままで何ら問題ないです。
このあたりのバランスを保つのが大事なのですが、まずはフレームワークで構築しておいて、問題がある箇所を崩していくというアプローチが単純で良いかと。
今回の場合、フレームワーク上で実装していたものをPHPスクリプトで再実装したので、同じ機能をアプローチを実装しただけなので、短時間で再実装することができました。プロトタイプ的にフレームワークで組むというのも良いかもしれません。
これに関連してミニTipsを。
フレームワーク無しで実装する際でもせめてDBの接続情報くらいは共有しておきたいものです。そこで今回はPHPスクリプトから[app/config/database.php]を参照するようにしました。
app/config/database.phpの情報からDBに接続する。
2 Responses
最近自分の周りでも「CakePHPは重い」と言われていました(個人的にはCakePHPが好きなので開発の規模が合えば必ず使っています)。
重い理由は、主にO/Rマッパー周りだと思っていたのですが、「フレームワークの起動」という考えはなかったです。
その上で上記エントリーのTipsは非常に参考になりました。
k1LoWさん:
汎用フレームワーク(CakePHPに限らず)はPlainなPHPに比べるとどうしてもオーバーヘッドがありますね。
フレームワークも「手段」でしかないので、k1LoWさんが書かれているようにケースバイケースで使うのが良いですね。:-)