XSERVERでエントリーを編集したのに古い情報が表示される(a-blog cms Ver. 3.0系)

レンタルサーバーのXSERVERで、a-blog cms Ver. 3.0.x を動かしている環境で、エントリーを編集したのに、古い情報が表示される問題が確認されております。

原因

キャッシュドライバーの「APCu」が原因で、XSERVERのある特定の環境の場合、キャッシュがPHPプロセス毎にキャッシュされてしまい、ランダムに古い情報が返ってきてしまいます。

再現する環境

  • a-blog cms Ver. 3.0.0 以上
  • キャッシュドライバーに「APCu」を指定している場合(デフォルト)
  • XSERVERの「Xアクセラレータ」が OFFまたは「Ver. 1」の場合

対策1

おすすめの対策は、XSERVERのコントロールパネルにログインし、「Xアクセラレータ Ver. 2」 を有効にする方法です。パフォーマンスもよくなりますので、a-blog cms Ver. 3.0.0 以上をXSERVERでお使いの場合は是非ご利用ください。

対策2

キャッシュドライバーに「APCu」を利用しない方法でも解決できます。「.env」ファイルを編集して「APCu」を利用しないようにします。

# テンプレートのキャッシュをするドライバーを選択します
CACHE_TEMPLATE_DRIVER=file
CACHE_TEMPLATE_NAMESPACE=template
CACHE_TEMPLATE_LIFETIME=2678400

# フィールド情報のキャッシュをするドライバーを選択します
CACHE_FIELD_DRIVER=file
CACHE_FIELD_NAMESPACE=field
CACHE_FIELD_LIFETIME=86400

# 一時キャッシュで利用するドライバーを選択します
CACHE_TEMP_DRIVER=memory
CACHE_TEMP_NAMESPACE=temp
CACHE_TEMP_LIFETIME=10800

XSERVERは a-blog cms の動作環境としてもお勧めしているサーバー環境ですので、現状お手数ですが a-blog cms Ver. 3.0.0 以上をお使いの場合は、必ず「Xアクセラレータ Ver. 2」を指定するようにお願いいたします。

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

拡張アプリ開発の基本

拡張アプリとして拡張機能を作ることにより、様々な拡張を1パッケージにして、ブログ単位でインストール出来るようになります。

拡張できる機能

  • 校正オプションの拡張
  • フック処理の拡張
  • Validatorの拡張
  • 独自GETモジュールの追加
  • 独自POSTモジュールの追加
  • テンプレートの挿入(テンプレートの拡張)

最低限必要なファイル

拡張アプリを作るためには、以下のファイルが最低限必要になります。

  • extension/拡張アプリのディレクトリ/ServiceProvider.php

このファイルがあれば、最小限の拡張アプリとして成立し、管理画面からインストールもできるようになります。このファイルは、アプリのバージョンや説明やインストール・アップデート時の処理や起動の初期処理を記述できるファイルになっています。詳しく見ていきましょう。

ServiceProvider.php

下のコードは、 ServiceProvider.php の 基本的なコードになります。

<?php

namespace Acms\Plugins\SamplePlugin;

use ACMS_App;

class ServiceProvider extends ACMS_App
{
    /**
     * @var string
     */
    public $version = '1.0.0';

    /**
     * @var string
     */
    public $name = 'SamplePlugin';

    /**
     * @var string
     */
    public $author = 'com.appleple';

    /**
     * @var bool
     */
    public $module = false;

    /**
     * @var bool|string
     */
    public $menu = false;

    /**
     * @var string
     */
    public $desc = 'サンプルのプラグインです。';

    /**
     * サービスの初期処理
     */
    public function init()
    {

    }

    /**
     * インストールする前の環境チェック処理
     *
     * @return bool
     */
    public function checkRequirements()
    {
        return true;
    }

    /**
     * インストールするときの処理
     * データベーステーブルの初期化など
     *
     * @return void
     */
    public function install()
    {

    }

    /**
     * アンインストールするときの処理
     * データベーステーブルの始末など
     *
     * @return void
     */
    public function uninstall()
    {

    }

    /**
     * アップデートするときの処理
     *
     * @return bool
     */
    public function update()
    {
        return true;
    }

    /**
     * 有効化するときの処理
     *
     * @return bool
     */
    public function activate()
    {
        return true;
    }

    /**
     * 無効化するときの処理
     *
     * @return bool
     */
    public function deactivate()
    {
        return true;
    }
}

プロパティ



プロパティ名 説明
$version バージョンを指定します。バージョン表記に決まりはありませんが、セマンティックバージョニングで付けるといいと思います。
$name 拡張アプリの名前を指定します。ここの名前が管理画面に表示されます。特に命名規則はありません
$author 作者を指定します。
$module ここにString(英数字)を指定すると、その名前でモジュールID作成の時、選択肢として表示されます。(非推奨)
$menu ここにString(英数字)を指定すると、そのURLで拡張アプリの管理画面が作成されます。
例: 'sample_index'
URL: /bid/1/admin/app_sample_index/
パス: themes/system/admin/app/sample/index.html
$desc 拡張アプリの詳細を記述します。管理画面で表示されます。

メソッド



メソッド名 説明
init インストールされた場合に動作し初期処理を記述できます。
例えば、Hook処理のバインドやテンプレートの挿入処理、autoloadの設定などに利用します。
checkRequirements インストール前のチェックに利用します。「false」を返すとインストールが出来ません。
install ルートブログのアプリ管理画面からアプリのインストール時に実行されます。データベースの初期化処理などに利用ください。
uninstall ルートブログのアプリ管理画面からアプリのアンインストール時に実行されます。データベースの削除処理などに利用ください。
update 拡張アプリのアップデート時に利用します。データ構造の変更などある場合に利用します。
activate 拡張アプリの有効時(ブログ単位)に動作します。インストール時にもここが実行されます。
deactivate 拡張アプリを無効化時(ブログ単位)に動作します。アンインストール時にもここが実行されます。

ポイント

  • extension/plugins/ の名前空間は 「Acms\Plugins」 です。
  • \ACMS_App を継承します。

これで拡張アプリ開発の基本は終了です。次から実際の拡張方法について見ていきます。

名前空間

拡張アプリでの拡張方法を見て行く前に、拡張アプリでの名前空間を説明します。

名前空間

ファイルのパスと命名規則はPSR4に従います。(ただし下位互換性を保つため一部したがっていない場合があります)

extension/plugins の名前空間は Acms\Plugins になります。

パス extension/plugins/SamplePlugin/ServiceProvider.php

クラス名 Acms\Plugins\SamplePlugin\ServiceProvider
記述例 <?php

namespace Acms\Plugins\SamplePlugin;

class ServiceProvider extends \ACMS_App
{
}

モジュールの拡張

拡張アプリでのモジュールの拡張方法を見ていきます。基本的には、通常の拡張方法と同様ですが名前空間・クラス名に気をつけましょう。

GET・POST モジュールは、extension/plugins/独自ディレクトリ/(GET|POST) ディレクトリ以下に設置します。

例: extension/plugins/SamplePlugin/GET/Sample.php

<?php

namespace Acms\Plugins\SamplePlugin\GET;

use ACMS_GET;
use Template;
use ACMS_Corrector;

/**
 * テンプレート上では、標準のGETモジュールと同様に、
 * '<!-- BEGIN_MODULE Sample --><!--END_MODULE Sample -->' で呼び出されます。
 */
class Sample extends ACMS_GET
{
    function get()
    {
        $Tpl = new Template($this->tpl, new ACMS_Corrector());
        $data = array();

        return $Tpl->render($obj);
    }
}

気をつける点としては、「GET」 は 全て大文字 なので注意してください。あとは、モジュールの開発 を参照ください。