SOY CMSで運営しているサイトの表示速度を向上させたいという依頼があったので、今まで温めていた改修案を組み込んでみた。
まずは表示が遅くなっていたサイトのパターンを整理しておくと、
ブロックやブログブロックで一度にたくさんの記事を表示していることが原因であった。
スクロールする度にAjaxで新たな記事を取得して出力というのがすぐに思い付くが、CMSの開発をしている者として一度に記事を取得するところの改善はしておきたい。
ということで、表示を遅くする要因を挙げてみる事にする。
HTMLのソースコードを組み立て出力するプログラムの実行において、データの読み込みで重い処理を順に挙げていくと、
・ファイルの読み込み
・データベースの読み込み
・メモリにあるデータの読み込み
・CPUのキャッシュにあるデータの読み込み
になる。
一番目のファイルの読み込みはSOY CMSで言えば、cms:moduleで指定するパーツモジュールあたりがある。
共通箇所はHTMLモジュールで管理する - SOY CMSを使ってみよう
cms:moduleは今回の課題とは関係ないのでこれ以上は触れない事にする。
二番目のデータベースの読み込みだけれども、データベースからデータを取得する回数や取得時のデータの量が処理の遅延の要因になる。
※データベーススキーマ(設計)の話があるが、それは今は触れないでおく。
SOY CMSでは、カスタムフィールドアドバンスドというプラグインで上記で挙げた課題が山積みであった。
冒頭にあるようなブロックで記事を表示する場合、今までの仕様であれば記事毎にデータベースに記事に紐付いたカスタムフィールドの値を取りに行くという処理であったため、ブロックで50件の記事を表示する場合、データベースからカスタムフィールドの値を50回取得しようと試みてしまっていた。
他に記事毎にカスタムフィールドの値を取得しようとした時に
SELECT * FROM EntryAttribute WHERE entry_id = 1;
のように、SELECT * (値を全部取得)になっていた。
このような無駄な処理は、SOY CMS内にある拡張ポイントの都合だったのだけれども、新たに拡張ポイントを設け、記事毎に紐付いたカスタムフィールドの値を全記事分一度に取得しつつ、値も表示で使用するものに絞って取得するようにした。
今回の改修はブロックで出力する記事数が少ない場合にはほとんど影響はないが、記事数が50や100件といったたくさん出力する場合は改善が期待できる。
三番目のメモリからの読み込みでもいくつか改善を試みたが、自信をもって挙げられるものではないのでこの場では控えておく。
今回対応分を含んだパッケージは下記のサイトからダウンロード出来ます。
追記
頻繁に使用されるサムネイルプラグインでも同様の改修を行っています