CakePHPでWebAPIを開発した時にハマったこと
あるプロジェクトでオンプレミス環境(自社運用型)に広報関係のWebサイトを構築する案件を担当しました。 主に広報に関わる内容でしたので、更新系の処理はほとんど無く、参照/表示がメインコンテンツとなるサイトです。 目次: WebAPI開発 試したこと.その1:インデックスを張りなおす 試したこと.その2:OPCacheを有効化する 疑惑と調査 試したこと.その3:フレームワークを切り替える 終わりに WebAPI開発 フロント(デザイン)をVue.jsで構築し、バックエンドはphp5.6で構成するSPAサイトで、オンプレミス環境のためサーバスペックも固定の基盤をターゲットにした開発案件でした。 このプロジェクトでは当初、phpではメジャーなフレームワークであるCakePHPを採用して開発していました。 一旦は滞りなく開発が完了したところで、本番環境と同等のコンテンツ量で最終確認を実施したところ、CakePHPで構築したAPIのレスポンスが著しく遅いことが判明し、とてもではないけれど本番にリリースができる代物ではありませんでした。 ここから速度改善に向けての試行錯誤が始まりました。 試したこと.その1:インデックスを張りなおす もともとインデックスの設定はしてあったのですが、後から仕様変更によって検索条件が変更されたケースがあったので、インデックスを張りなおしてみました。 しかし、この対応には目に見えた効果は無く、一部検索条件の際に生じていた更なる速度低下を抑え込む程度の改善効果しかありませんでした。 試したこと.その2:OPCacheを有効化する phpはインタプリタ型のスクリプト言語で、コンパイル不要の手軽さが売りですが、その分速度を犠牲にしている面があります。 OPCacheとはphpコードをコンパイルし、コンパイルされたコードをメモリにキャッシュすることで高速化を図る仕組みです。 このOPCacheの導入により、およそ2倍の速度改善を実現することができました。が、しかし、それでもまだサイトを表示するときの体感速度は遅く、まだまだ本番にリリースできる状態とは言えませんでした。 疑惑と調査 確かにコンテンツ量は多く、また、デザイン要件のため一度に取得するデータ量を抑え込むことが難しかったとはいえ、キャッシュしても実用に耐えられない速度に疑問を抱きました。 そこで、おもむろに開発環境で動作中のWebサイトに向けてF5連打をしてみたところ、あっという間にCPU使用率が最大値に張り付いてしまうことが判明したのです。 負荷試験ツールであるJMeterで計測している時にCPU使用率が最大値で張り付いていることは認識していましたが、一人のアクセスユーザーがF5を連打しただけで開発機がパンクしてしまうのは尋常では無いと考え、諸々調査したところ、php5.x系とCakePHPの組み合わせではCPU負荷が高くなりやすく、php7から改善されたという情報を目の当たりにしたのです。 https://www.php.net/archive/2015.php#id2015-12-03-1 ※公式リリースにも2倍速くなったという記載が。 ・Improved performance: PHP 7 is up to twice as fast as PHP 5.6 試したこと.その3:フレームワークを切り替える この時のプロジェクトではハードウェアもミドルウェアも全てが指定されていたため、phpのバージョンを上げるという対策を取ることはできませんでした。 そこで、技術選定できるフレームワークを見直すことを考え、CakePHPよりも高速なフレームワークが無いか調べたところ、Phalconに辿り着いたのです。 https://phalcon.io/ja-jp ロジックのコア部分は完成していたので、CakePHPからPhalconに載せ替えを行うイメージの開発でしたが、これにはそれほど時間はかかりませんでした。 結果として、スループットで比較すると初期のOPCache無しと比べておよそ16倍、OPCacheありと比べてもだいたい8倍近い速度改善を達成することができたのです。 もちろん、Webサイトを表示する体感速度も見違えるほど良くなり、F5を連打をしてもCPU使用率は20%前後で頭打ちとなる改善を果たすことができました。 終わりに CakePHPにもREST-API開発を目的とした仕組みはあります。(ルーティングの設定であったり、jsonを返却したり) 真っ先に飛びついたのですが、この時はあまり改善を見ることができませんでした。 恐らくDBのO/Rマッピングがボトルネックになっていたのではないかと推測しています。 昨今のWeb開発においてはフレームワークの利用は当たり前で、工数的にもセキュリティ的にも、これを用いずにゼロから開発するということは考えられません。 ですが、フレームワークにも得手不得手があるのも事実です。 いまや切っても切り離せない重要な役割を担うフレームワークだからこそ、システム要件と十分につき合わせた選定が大事になるかと思います。