Ver. 3.0 の パフォーマンスを検証!


2021年12月24日 にメジャーバージョンアップである Ver. 3.0 がリリースされました!

ionCube PHP Encoder の廃止

やはり Ver. 3.0 で大きな変更点は、ionCube PHP Encoderの廃止ではないでしょうか。 もちろん 暗号化がなくなったので、セキュリティ対策としては若干落ちますが、コアプログラムは難読化されていますしメリットも多くあるため、より便利に a-blog cmsを利用できるようになったと思います。

ionCube PHP Encoder 廃止によるメリット

  • インストール時に、ionCube Loaderのインストール作業が不要になる
  • インストール時に、インストールできるサーバー環境が増える
  • サーバー側で強制的にPHPバージョンが変更されても、サイトが停止しない
  • PHPのバージョンを変更する際に、パッケージを変える必要がない
  • ionCube Loaderの開発状況に左右されないため、新しいPHPバージョンに対応したパッケージがより早く提供される

Ver. 3.0 のパフォーマンス検証

Ver. 3.0 の特徴として、パフォーマンス周りの改善がみられます。

  • PHP8.0 対応
  • テンプレートキャッシュを導入
  • その他キャッシュ機能を強化(キャッシュ対象の増加、APCu対応など)

そこで今回は、Ver. 2.11.42 と Ver. 3.0 のパフォーマンスを計測し、Ver. 3.0 のパフォーマンスを検証していきたいと思います。

前提条件

計測するサーバーは、a-blog cms の設置サーバーとしてよく選ばれる、Xserver スタンダードを選択しました。

  • Xserver スタンダード(旧X10)
  • siteテーマの初期状態で計測
  • トップページ、一覧(お知らせ一覧)、詳細ページ(ユニットによる要素の掲載例)を計測
  • 計測はApache Benchを使用(10ユーザーが合計100アクセスするのにかかった秒数を計測)

Ver. 2.11.42 の測定結果

設定内容

  • PHP 7.425
  • MySQL 5.7.x
  • Xアクセラレータ Ver.1 有効


ページ CMSのページキャッシュなし CMSのページキャッシュあり
トップページ 5.214 秒(19.18 #/s) 3.020 秒(33.11 #/s)
一覧ページ 5.610 秒(17.83 #s) 3.073 秒(32.53 #/s)
詳細ページ 6.001 秒(16.66 #s) 3.281 秒(30.48 #/s)

Ver 3.0.0 の測定結果

設定内容(Ver. 2.11 と同じ条件で計測)

  • PHP 7.425
  • MySQL 5.7.x
  • Xアクセラレータ Ver.1 有効
  • テンプレートキャッシュオフ


ページ CMSのページキャッシュなし CMSのページキャッシュあり
トップページ 3.908 秒(27.21 #/s) 3.054 秒(32.74 #/s)
一覧ページ 3.802 秒(26.30 #s) 2.776 秒(36.02 #/s)
詳細ページ 3.940 秒(25.38 #s) 2.980 秒(33.55 #/s)

設定内容(テンプレートキャッシュON)

  • PHP 7.425
  • MySQL 5.7.x
  • Xアクセラレータ Ver.1 有効
  • テンプレートキャッシュON


ページ CMSのページキャッシュなし CMSのページキャッシュあり
トップページ 3.565 秒(28.05 #/s) 2.884 秒(34.67 #s)
一覧ページ 3.679 秒(27.18 #s) 2.715 秒(36.83 #s)
詳細ページ 3.751 秒(26.66 #s) 3.006 秒(33.27 #s)

設定内容(PHP8.0, テンプレートキャッシュON)

  • PHP 8.0.12
  • MySQL 5.7.x
  • Xアクセラレータ Ver.1 有効
  • テンプレートキャッシュON


ページ CMSのページキャッシュなし CMSのページキャッシュあり
トップページ 3.604 秒(27.75 #/s) 2.709 秒(36.91 #/s)
一覧ページ 3.793 秒(26.36 #s) 2.786 秒(35.89 #/s)
詳細ページ 4.027 秒(24.83 #s) 3.091 秒(32.36 #/s)

設定内容(Xアクセラレータ Ver.2 有効, PHP8.0, テンプレートキャッシュON)

  • PHP 8.0.12
  • MySQL 5.7.x
  • Xアクセラレータ Ver.2 有効
  • テンプレートキャッシュON


ページ CMSのページキャッシュなし CMSのページキャッシュあり
トップページ 3.615 秒(27.66 #/s) 2.732 秒(36.60 #/s)
一覧ページ 3.759 秒(26.61 #s) 2.634 秒(37.96 #/s)
詳細ページ 4.022 秒(24.87 #s) 2.775 秒(36.03 #/s)

以上が計測結果になります。いかがでしたでしょうか。

Ver. 2.11.42 と比べると Ver. 3.0.0 は ページキャッシュ未使用時のパフォーマンスが良くなっている事がわかります。 会員サイトや、編集時などログインしている状況でのパフォーマンスが良くなっていそうです。

CMSのページキャッシュが有効時は、Ver. 2.11 も Ver. 3.0 もそこまで大差はないかと思います。

PHP8.0 や Xアクセラレータ Ver.2 は、今回のテストでは思ったより改善は見られませんでした。 若干キャッシュあり時のパフォーマンスが良くなった程度でしょうか。

もちろん今回の検証は限られた設定やテーマでの検証ですので、サーバー環境やテーマの作り方が変わると結果も変わってくると思います。 ただログインしている時やキャッシュオフの状態のパフォーマンスは体感できるぐらい違いを感じますので、ぜひ一度 Ver. 3.0 を試してみてください。 特にあまりパフォーマンスがよくない環境だと、差が顕著になると思います。

以上、Ver. 3.0 のパフォーマンス検証でした。

追加情報

XSERVER の 新サーバー簡単移行 のサービスを利用すると 最新サーバー環境(sv13001.xserver.jp~) へ引っ越しをすることができます。 上記の計測後にサーバーを引っ越ししましたので、そのデータも共有しておきます。

設定内容(サーバーID sv13xxx, Xアクセラレータ Ver.2 有効, PHP8.0, テンプレートキャッシュON)

  • PHP 8.0.12
  • MySQL 5.7.x
  • Xアクセラレータ Ver.2 有効
  • テンプレートキャッシュON


ページ CMSのページキャッシュなし CMSのページキャッシュあり
トップページ 2.561 秒(39.05 #/s) 1.935 秒(51.68 #/s)
一覧ページ 2.785 秒(35.91 #s) 1.977 秒(50.58 #/s)
詳細ページ 2.876 秒(34.77 #s) 1.963 秒(50.94 #/s)

Ver. 3.0.2 リリースのお知らせ


この記事では、2022年1月6日にリリースした Ver. 3.0.2 の修正内容について紹介いたします。

現在お困りの問題に該当する項目がありましたら、お早めにバージョンアップのご検討をお願いいたします。

Ver. 3.0.2 リリースノート

  • CMS-5789 メディア機能でアップロードされた画像の画質を向上
  • CMS-5819 Ver. 3系で、ナビゲーションモジュールの編集UIが表示されない問題を修正
  • CMS-5820 校正オプション「substring」の引数でマイナスを指定する時、シングルクウォートで囲わないと動作しない問題を修正
  • CMS-5821 ユニット設定で、リッチエディタが選べない問題を修正

主なリリースノートの詳細な内容

CMS-5789 メディア機能でアップロードされた画像の画質を向上

メディアの画像アップロードで、条件によって画質劣化がひどくなる問題を修正を修正しました。 特に元画像のサイズが大きい場合、再現しやすい状況となります。

詳しくは、こちらの記事で紹介しておりますので、ご覧ください。
メディア機能の画質改善をしました

CMS-5820 校正オプション「substring」の引数でマイナスを指定する時、シングルクウォートで囲わないと動作しない問題を修正

Ver. 3.0 で新しく追加された「substring」校正オプションで、以下のようにマイナスの数値を指定をすると、正しく動作しない問題を修正しました。

{hoge}[substring(-3)]

CMS-5821 ユニット設定で、リッチエディタが選べない問題を修正

ユニット設定で「リッチエディタ」が選択できない問題を修正しました。
これにより新規エントリー作成時の初期ユニットとして「リッチエディタ」を選べない問題などが解消されました。



この度は、ご不便をおかけしてしまい申し訳ございません。
現在お困りの問題に該当する項目がありましたらご対応のほどよろしくお願いいたします。

今後とも a-blog cms をよろしくお願いいたします。

フォームに reCAPTCHA を導入してボットからのアクセスを遮断する


a-blog cms Ver.2.8.0から拡張機能より、GoogleのreCAPTCHA機能が使用できます。 ウェブサイトにアクセスを試みるボットを遮断するために設置されているreCAPTCHAですが一度はどこかで体験したことがあると思います。webのフォームは一番攻撃されやすい箇所になります。reCAPTHAを導入して、ロボットによるスパム投稿を防ぎましょう。


ロボットでないことを証明する

ロボットでないことを証明する


下準備

まずreCAPTCHAを導入するために、reCAPTCHA にアクセスして、必要な情報を取得します。

「Domains」の項目はご利用のサイトのドメインを指定してください。


(スクリーンショット)

サイトのドメイン登録


(スクリーンショット)

Site key と Secret key の取得


サイトを登録し、以下2つのキーを使用しますのでメモしておいてください。

  • Site key
  • Secret key

クライアント実装

下準備ができましたので、まずはクライアントサイドを実装します。

JavaScript

以下コードを ご利用のテーマのフォームの head要素内に読み込んでください。

例えば、simple2016テーマなら themes/simple2016/contact/index.html です。

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<script>
  function validateRecaptcha ( code ) {
    if ( !!code ) {
      var form = document.querySelector(".recaptcha");
      form.removeAttribute('disabled');
    }
  }
</script>

HTML

次に送信フォームを少し修正します。simple2016テーマなら themes/simple2016/contact/form/main.html を開きます。

以下コードを送信フォーム内に挿入します。ここで、{Site key} は 下準備で取得した Site keyに置き換えてください。

<div class="g-recaptcha" data-callback="validateRecaptcha" data-sitekey="{Site key}"></div>

次に、送信ボタンに recaptcha クラスをふり、 disabled にしておきます。

<input type="submit" name="ACMS_POST_Form_Submit" value="送信する" id="btnSubmit" class="recaptcha btn-attention-block-large" disabled />

完成例

例として themes/simple2016/contact/form/main.html を編集しています。

<!-- BEGIN step#confirm -->
...

<form action="thanks.html" method="post" class="form-btn form-btn-send" enctype="multipart/form-data">

    <div class="g-recaptcha" data-callback="validateRecaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxx"></div>

    <input type="hidden" name="To[]" value="{email}" />
    <input type="hidden" name="AdminReply-To[]" value="{email}" />
    <input type="hidden" name="AdminFrom[]" value="{email}" />
    <input type="hidden" name="step" value="result" />
    <input type="hidden" name="takeover" value="{takeover}" />
    <input type="hidden" name="id" value="contactForm" />
    <input type="submit" name="ACMS_POST_Form_Submit" value="送信する" id="btnSubmit" class="recaptcha btn-attention-block-large" disabled />
</form>

クライアントサイドは完成です。実際に動かしてみましょう。フォームの確認画面まで行くと、reCAPTCHAが表示され、送信ボタンが押せないようになっているかと思います。reCAPTCHAで承認が通ると送信ボタンが押せるようになります。


(スクリーンショット)

チェックするまで送信ボタンが押せない


サーバーサイド実装

クライアントサイドの実装ができると、一見動いていそうに見えますが、このままだと送信ボタンの disabled を開発者ツールなどで削除してしまえば、送信できるようになってしまいます。そこで、サーバーサイドで認証を行いましょう。

認証の仕組み

ユーザーがreCAPTCHAの認証を通ると、ランダムな文字列のコードが生成され、フォーム送信時に一緒に送信されます。 このコードを使って、サーバーサイドでreCAPTCHAのapiにリクエストを投げ、正しいコードかチェックを行うことにより、正常な手段でフォームが送信されたことを確認することができます。

実装

実装にはHook機能を使います。php/ACMS/User/Hook.phpbeforePostFire に以下のコードを追加しましょう。

config.server.phpのHOOK_ENABLEを 1 にしておきましょう。

public function beforePostFire($thisModule)
{
    $moduleName = get_class($thisModule);

    if ( $moduleName === 'ACMS_POST_Form_Submit' ) {
        $secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
        $response = $thisModule->Post->get('g-recaptcha-response');
        $api = "https://www.google.com/recaptcha/api/siteverify?secret=${secret}&response=${response}";

        $valid = false;
        if ( $res = @file_get_contents($api) ) {
            $check = json_decode($res);
            if ( $check->success === true ) {
                $valid = true;
            }
        }

        if ( !$valid ) {
            $Field  = $thisModule->extract('field');
            $Field->setMethod('g-recaptcha-response', 'check', false);
            $thisModule->Post->set('step', 'forbidden');
        }
    }
}

ここで、 $secret を、下準備で用意した Secret key で置き換えます。これで実装は完了です。

確認

では実際に、サーバーサイドで認証ができているかチェックしてみましょう。フォームで確認画面まで移動して、 disabled になっている送信ボタンを、開発者ツールで disabled を外して送信してみましょう。以下の画像のようにサーバーサイドで不正なアクセスとして処理されていることが確認できます。


不正なアクセスとして処理される

不正なアクセスとして処理される