## 実行時設定

php.ini の設定により動作が変化します。

大半のインストール環境では、APCu はデフォルトの設定で問題ありません。 しかし、本格的なユーザーは以下のパラメータのチューニングを考慮すべきです。

APCuを設定するには、ひとつ決断が必要です。 どれくらいのメモリをAPCuに割り当てるのかということです。 この値を制御するのは `apc.shm_size` です。 以下のこれに関するセクションを注意深く読んで下さい。

サーバーがいったん起動したら、 拡張モジュールにバンドルされている `apc.php` スクリプトをドキュメントルートのどこかにコピーし、ブラウザから見てみましょう。 apcu の内部動作を詳細に分析した情報が見られるからです。 gd が有効になっている場合、面白いグラフも見られるでしょう。

apcu が動作している場合、(左側の) `Cache full count` の数が、キャッシュの容量が一杯になり、 メモリを開放するためにエントリを強制的に掃除しなければならなかった回数を示しています。 強制的に掃除している間、`apc.ttl` が指定されている場合、 APCu はまず期限切れのエントリを削除しようとします。 つまり、TTL が期限切れになったか、 TTL が設定されずに `apc.ttl` 秒間アクセスがないエントリです。 `apc.ttl` が指定されていないか、 期限切れのエントリを削除しても十分な容量を確保できない場合、 APCu はキャッシュ全体を削除してしまいます。

強制的に掃除しなければならなかった回数は、 上手に設定されているキャッシュであれば最小にすべきです。 キャッシュが頻繁に一杯になり、強制的に開放される場合、 スクリプトのパフォーマンスに悪影響が出てしまいます。 この数値を最小にする一番簡単な方法は、APCu により多くのメモリを割り当てることです。

APCu が mmap (メモリマッピング) のサポートを有効にしてコンパイルされている場合、 APCu はメモリセグメントをひとつしか使いません。 一方で、SHM (SysV共有メモリ) を有効にしてビルドした場合は、複数のメモリセグメントを使います。 SHM は `/proc/sys/kernel/shmmax` で最大値を持っていますが、MMAP にはそれがありません。 一般的には、MMAP のサポートを有効にすることをおすすめします。 なぜなら、MMAPはWebサーバーが再起動したときのメモリの再要求の速度が速く、 全体として起動時のメモリ割り当ての負荷が減るからです。

APCu の設定オプション
名前 | デフォルト | 変更可能 | 変更履歴
--- | --- | --- | ---
apc.enabled | 1 | `INI_SYSTEM` |
apc.shm_segments | 1 | `INI_SYSTEM` |
apc.shm_size | "32M" | `INI_SYSTEM` |
apc.entries_hint | 512 * apc.shm_size | `INI_SYSTEM` | APCu 5.1.25 より前のバージョンでは、この値のデフォルト値は 4096 でした。
apc.ttl | 0 | `INI_SYSTEM` |
apc.gc_ttl | 3600 | `INI_SYSTEM` |
apc.mmap_file_mask | NULL | `INI_SYSTEM` |
apc.slam_defense | 0 | `INI_SYSTEM` |
apc.enable_cli | 0 | `INI_SYSTEM` |
apc.use_request_time | 0 | `INI_ALL` | APCu 5.1.19 より前のバージョンでは、デフォルト値は `1` でした。
apc.serializer | "php" | `INI_SYSTEM` | APCu 5.1.15 より前のバージョンでは、デフォルト値は `"default"` でした。
apc.coredump_unmap | 0 | `INI_SYSTEM` |
apc.preload_path | NULL | `INI_SYSTEM` |

INI_* モードの詳細および定義については どこで設定を行うのか を参照してください。

以下に設定ディレクティブに関する 簡単な説明を示します。

`apc.enabled` bool
  APC を無効にする場合、`apc.enabled` を0に設定できます。 これはAPCがPHPに静的にコンパイルされている場合に役に立ちます。 なぜなら、これ以外にAPCを無効にする方法がないからです。 (DSO としてコンパイルされている場合、 `php.ini` の `extension` の行をコメントアウトすれば済みます)
`apc.shm_segments` int
  コンパイラキャッシュに割り当てる共有メモリセグメントの数。 APC の共有メモリが不足したが、`apc.shm_size` にシステムが許可できるできるだけ高い値を設定している場合、 この値を増やすことでAPCがメモリ不足になることを避けられるかもしれません。
`apc.shm_size` string
  個別の共有メモリセグメントのサイズ。 このFAQ で説明している短縮記法を使います。 デフォルトでは、システムによって(ほとんどのBSD系)は、 共有メモリセグメントのサイズの限界値がとても小さい場合があります。
`apc.entries_hint` int
  異なる値を保存する数のおおよその"ヒント"。 わからない場合はゼロを設定して下さい。
`apc.ttl` int
  ここで指定された秒数アクセスされていない場合、 TTL を明示的に指定しないキャッシュエントリが期限切れとみなされます。 こうすることで、キャッシュを挿入している間や、すべてのキャッシュを削除する前に、 そうした期限切れのエントリを都合よく削除できます。 こうした削除は場当たり的に行われるため、 `apc.ttl` 秒より古いデータであっても まだ読み取れてしまうことがあり得るので注意してください。 この設定は、TTLが明示的に指定されたキャッシュエントリに対しては意味がありません。
`apc.gc_ttl` int
  削除されたり、無効になったキャッシュエントリがガベージコレクションのリストに残っても良い秒数。 エントリは、リファレンスカウントがゼロになった時、またはこの設定の秒数を越えた場合に、削除候補になります。 `0` を設定すると、時間ベースの削除機能は無効になり、リファレンスカウントがゼロになったときにのみ削除されます。
`apc.mmap_file_mask` string
  `--enable-mmap` を使ってPHPをコンパイルした場合に、 mmapされたメモリ領域をファイルベースか共有メモリベースにするかを決めるために、 mmapモジュールに渡すmktempスタイルのファイルマスク。 ファイルベースのmmapの場合、 `/tmp/apc.XXXXXX` のように設定します (`X` はちょうど6つにして下さい)。 POSIXスタイルの shm_open/mmap を使う場合、 `.shm` をマスクのどこかに含めて下さい。 e.g. `/apc.shm.XXXXXX`。 匿名のmmapされたメモリを使うために kernel の `/dev/zero` インターフェイスを使う場合、 この値に `/dev/zero` も設定できます。
`apc.slam_defense` bool
  とても負荷が高いサーバーでは、いつサーバーを起動したり、 変更したりしても、同じファイルを同時にキャッシュしようとする 多くのプロセスの競合が発生します。 `apc.slam_defense` の値を `1` に設定すると、確率的な仕組みを使うことで、 複数のプロセスが同時に同じファイルをキャッシュするのを防ぐのを助けます。 同じキーが短期間に異なるプロセスからキャッシュされようとすると、 現在のプロセスがキャッシュをスラム化させるのを防ぐため、 キャッシュをスキップします。
`apc.enable_cli` int
  この設定はほとんどの場合、テストかデバッグに使います。 これを設定すると、CLI版PHPでAPCが有効になります。 通常の状態では、CLI リクエストのたびにAPCキャッシュを生成し、 収集し、破棄するのは望ましくありません。しかし、テストシナリオによっては、 CLI版のPHPでAPCを簡単に有効に出来た方が便利な場合があります。
`apc.serializer` string
  APCにサードパーティーのシリアライザを使わせる場合に使います。
`apc.coredump_unmap` bool
  SIGSEGV のようなシグナルのシグナルハンドラをAPCで有効にします。 ハンドラでは、シグナルを受け取ったときにコアファイルに書き込みます。 これらのシグナルを受け取った場合、 APC はコアファイルから除外するために共有メモリセグメントをアンマップしようとします。 この設定は致命的なシグナルを受け取ったり、 APCの共有メモリセグメントの数を大きく設定している場合に、 システムの安定性を向上させる可能性があります。
  警告

  この機能は潜在的に危険です。 致命的なシグナルハンドラで共有メモリセグメントをアンマップすると、 致命的なエラーが発生したときの動作が未定義になる可能性があるからです。

  > 注意: kernel によっては、コアダンプファイルを生成するときに 様々なタイプの共有メモリを無視する機能を提供するものがあります。 こうしたkernelの実装は、 Apache scoreboard のような重要な共有メモリセグメントも無視するかもしれません。

`apc.preload_path` string
  オプション。キャッシュデータを起動時に読み込むディレクトリのパスを設定します。
`apc.use_request_time` bool
  TTL に SAPI リクエストの開始時刻を使います。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open