プロダクション

プロダクション環境用の構成のためにキャッシュの設定やスクリプトの変更を行います。

bootファイル

コンテキストがprod-で始まるとアプリケーションオブジェクト$appがキャッシュされます。 キャッシュドライバーは環境に応じてApcCacheFilesystemCacheが自動選択されます。

$context = 'prod-app';
require dirname(dirname(__DIR__)) . '/bootstrap/bootstrap.php';

キャッシュの設定

ProdModule

デフォルトのProdModuleはwebサーバー1台を前提にしているApcCacheになっています。 複数のWebサーバーを構成するためには共有のキャッシュストレージを設定する必要があります。

アプリケーション用のProdModulesrc/Module/ProdModule.phpに用意して、サーバー間で共有するコンテンツ用キャッシュのストレージのモジュール(memcachedまたはRedis)をインストールします。

memcached

namespace BEAR\HelloWorld\Module;

use BEAR\QueryRepository\StorageMemcachedModule;
use BEAR\Package\Context\ProdModule as PackageProdModule;
use Ray\Di\AbstractModule;
use Ray\Di\Scope;

class ProdModule extends AbstractModule
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        // memcache
        // {host}:{port}:{weight},...
        $memcachedServers = 'mem1.domain.com:11211:33,mem2.domain.com:11211:67';
        $this->install(new StorageMemcachedModule(memcachedServers);

        // デフォルトのProdModuleのインストール
        $this->install(new PackageProdModule);
    }
}

Redis

// redis
$redisServer = 'localhost:6379'; // {host}:{port}
$this->install(new StorageRedisModule($redisServer);

キャッシュ時間の指定

デフォルトのTTLを変更する場合

// Cache time
$short = 60;
$medium = 3600;
$long = 24 * 3600;
$this->install(new StorageExpiryModule($short, $medium, $long);

HTTP Cache

キャッシュ可能(@Cacheable)とアノテートしたリソースはエンティティタグETagを出力します。

このETagを使ってリソースに変更が無い時は自動で適切な304 (Not Modified)のレスポンスコードを返すことができます。 (この時、ネットワークの転送コストだけでなく、CPUコストも最小限のものにします。)

App

HttpCacheをスクリプトで使うためにAppクラスでHttpCacheInjectのtraitを使ってHttpCacheをインジェクトします。

namespace MyVendor\MyApi\Module;

use BEAR\QueryRepository\HttpCacheInject; // この行を追加
use BEAR\Sunday\Extension\Application\AbstractApp;
use Ray\Di\Di\Inject;

class App extends AbstractApp
{
    use HttpCacheInject; // この行を追加
}

bootstrap

bootstrap/bootstrap.phpで以下のようにif文を追加して、ETagのコンテンツに変更がなければ304 (NotModified)を出力するようにします。


$app = (new Bootstrap)->getApp('BEAR\HelloWorld', $context, dirname(__DIR__));
if ($app->httpCache->isNotModified($_SERVER)) {
    http_response_code(304);
    exit(0);
}

ETagの更新は自動で行われますが、@Refresh@Purgeアノテーションを使ってリソースキャッシュの破棄の関係性を適切に指定しておかなければなりません。

デプロイ

DeployerのサポートBEAR.Sunday Deployer.php supportをご覧ください。