• このプロダクションマニュアルは2020/7/4まで掲載されていたBEAR.Package 0.9のマニュアルです。

プロダクション

アプリケーションのディプロイ環境に応じてキャッシュの設定や束縛の変更を行います。

コンテキスト

prodはプロダクションのためのコンテキストです。 ルートオブジェクト$appやアノテーションリーダーなどでキャッシュが使われます。

<?php
require dirname(__DIR__) . '/autoload.php';
exit((require dirname(__DIR__) . '/bootstrap.php')('prod-api-app'));

重要:

プロダクションではディプロイ毎に$appを再生成する必要があります。

$appを再生成するにはsrc/ディレクトリのタイムスタンプを変更します。 BEAR.Sundayはそれを検知して$apptmp/{context}/diのDI/AOPファイルの再生成を行います。

ProdModule

アプリケーション用のProdModulesrc/Module/ProdModule.phpに設置して、プロダクション用の束縛をカスタマイズやHTTP OPTIONSメソッドの許可を行う事ができます。

<?php
namespace Polidog\Todo\Module;

use BEAR\Package\Context\ProdModule as PackageProdModule;
use BEAR\QueryRepository\CacheVersionModule;
use BEAR\Resource\Module\OptionsMethodModule;
use BEAR\Package\AbstractAppModule;

class ProdModule extends AbstractModule
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->install(new PackageProdModule);       // デフォルトのprod設定
        $this->install(new OptionsMethodModule);     // OPTIONSメソッドをプロダクションでも有効に
        $this->install(new CacheVersionModule('1')); // リソースキャッシュのバージョン指定
    }
}

キャッシュ

キャッシュは複数のWebサーバー間でシェアをしないローカルキャッシュと、シェアをする共有キャッシュの2種類あります。ローカルキャッシュはdeploy後に変更のないキャシュ例えばアノテーション等に使われ、共有キャッシュはリソース状態の保存に使われます。

どちらのキャッシュもデフォルトでは「APCuキャッシュ+ファイルキャッシュ」のチェーンキャッシュです。リードはAPCuが優先して使用されライトは両方のストレージに行われます。

リソースキャッシュ

複数のWebサーバーを構成するためには共有のキャッシュストレージを設定する必要があり、(memcachedまたはRedis)のモジュールをインストールします。

Memcached

<?php
namespace BEAR\HelloWorld\Module;

use BEAR\QueryRepository\StorageMemcachedModule;
use BEAR\Package\Context\ProdModule as PackageProdModule;
use BEAR\Package\AbstractAppModule;
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を変更する場合StorageExpiryModuleをインストールします。

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

キャッシュバージョンの指定

リソースキャッシュの互換性が失われるdeployの時にはキャッシュバージョンを変更します。

$this->install(new CacheVersionModule($cacheVersion));

deployの度にリソースキャッシュを破棄したい場合は$cacheVersionに時刻や乱数の値を割り当てます。

デプロイ

⚠️ 上書き更新を避ける

駆動中のプロジェクトフォルダをrsyncなどで上書きするのはリソースキャッシュの不一致やtmp/に作成される自動生成のクラスファイルと実際のクラスとの不一致になるリスクがあります。高負荷のサイトではキャッシュ作成やopcode作成などの大量のジョブが同時に複数実行されサイトのパフォーマンスのキャパシティを超える可能性もあります。

別のディレクトリでセットアップを行いそのセットアップが問題なければ切り替えるようにします。

コンパイル推奨

セットアップを行う際にvendor/bin/bear.compileスクリプトを使ってプロジェクトをウオームアップすることができます。コンパイルスクリプトはDI/AOP用の動的に作成されるファイルやアノテーションなどの静的なキャッシュファイルを全て事前に作成し、最適化されたautoload.phpファイルとpreload.phpが出力されます。

全てのクラスでインジェクションを行うのでランタイムでDIのエラーが出ることもありません。また.envには一般にAPIキーやパスワードなどのクレデンシャル情報が含まれますが、内容は全てPHPファイルに取り込まれるのでコンパイル後に消去可能です。コンパイルはdeployをより高速で安全にします。

例)コンソールで実行

vendor/bin/bear.compile 'Polidog\Todo' prod-html-app /path/to/prject

autoload.php

{project_path}/autoload.phpに最適化されたautoload.phpファイルが出力されます。composer dumpa-autoload --optimizeでダンプされるvendor/autoload.phpよりずっと高速です。

preload.php

{project_path}/preload.phpに最適化されたpreload.phpファイルが出力されます。preloadを有効にするためにはphp.iniでopcache.preloadopcache.preloadを指定する必要があります。PHP 7.4でサポートされた機能ですが、7.4.0-7.4.2では不安定で推奨できません。7.4.4以上の最新版を使いましょう。

例)

opcache.preload=/path/to/project/preload.php
opcache.preload_user=www-data

Note: パフォーマンスについてはbechmarkを参考にしてください。

Deployerサポート

DeployerBEAR.Sundayレシピを利用が便利で安全です。他のサーバー構成ツールを利用する場合でも参考にしたりDeployerスクリプトを実行することを検討してください。またDeployerをプロジェクトのディレクトリを毎回生成するので$appの再生成を気にする必要がありません。