3

次のように、PHP配列のPHPファイルにデータをキャッシュするとします。

/cache.php

<?php return (object) array(
    'key' => 'value',
);

そして、次のようにキャッシュファイルを含めます。

<?php
$cache = include 'cache.php';

ここで問題は、キャッシュ ファイルが APC によって自動的にメモリにキャッシュされるかどうかです。すべての .php ファイルと同様に、典型的なオペコード キャッシュを意味します。

たとえば JSON 形式 (cache.json) でデータを別の方法で保存すると、データは APC によって自動的にキャッシュされませんか?

apc_storeより速く/好ましいでしょうか?

4

3 に答える 3

10

APC のキャッシング機能と、中間コードを最適化し、コンパイル済みコードをキャッシュする機能を混同しないでください。APC は 2 つの異なるものを提供します。

  1. データ構造 (オブジェクト、配列など) をキャッシュする便利な方法を提供するため、apc_store および apc_fetch でそれらを保存/取得できます。
  2. スクリプトのコンパイル済みバージョンを保持するため、次回の実行時に高速に実行されます

(1) の例を見てみましょう: 計算に 1 秒かかるデータ構造があるとします:

function calculate_array() {
    sleep(1);
    return array('foo' => 'bar');
}
$data = calculate_array();

遅い calculate_array() を再度呼び出す必要がないように、その出力を保存できます。

function calculate_array() {
    sleep(1);
    return array('foo' => 'bar');
}
if (!apc_exists('key1')) {
    $data = calculate_array();
    apc_store('key1', $data);
} else {
    $data = apc_fetch('key1');
}

これはかなり速くなり、元の 1 秒よりもはるかに短くなります。

さて、上記の (2) について: APC を使用しても、プログラムの実行が 1 秒より速くなることはありません。これは、calculate_array() が必要とする時間です。ただし、ファイルの初期化と実行にさらに (たとえば) 100 ミリ秒必要な場合、APC を有効にするだけで (約) 20 ミリ秒必要になります。したがって、初期化/準備時間が 80% 増加します。これは実稼働システムに大きな違いをもたらす可能性があるため、APC をインストールするだけで、スクリプトの関数を明示的に呼び出さなくても、スクリプトのパフォーマンスに顕著なプラスの影響を与えることができます。

于 2013-01-11T20:08:00.610 に答える
2

(例のように)静的データを保存するだけの場合は、を使用することをお勧めしますapc_store

この背後にある理由は、オペコード キャッシュが速いか遅いかではなく、include静的データをスコープにフェッチするために使用しているという事実です。

オペコード キャッシュを使用しても、実行ごとにファイルの一貫性がチェックされます。PHP は内容を解析する必要はありませんが、ファイルが存在するかどうか、およびオペコード キャッシュが作成されてからファイルが変更されていないかどうかを確認する必要があります。ファイルシステムのチェックは、たとえそれがstatファイルに対してのみであっても、リソースを消費します。

したがって、apc_storeファイルシステム チェックを完全に削除するために使用する2 つのアプローチのうち、

于 2013-01-11T20:23:04.050 に答える
1

他の答えとは異なり、私は array-file-solution (最初のもの) を使用します

<?php return (object) array(
    'key' => 'value',
);

その理由は、どちらのソリューションでも正しい側にいるためですが、キャッシュを APC 自体に任せると、apc_*()-functions をいじる必要がなくなります。単純に含めて使用します。設定すると

apc.stat = 0

statすべてのインクルードでも -callsを避けます。これは本番環境では便利ですが、デプロイごとにシステム キャッシュをクリアすることを忘れないでください。

http://php.net/apc.configuration.php#ini.apc.stat

ああ、忘れないでください: ファイル アプローチでは、APC がなくても機能します。通常はキャッシュを使用しない開発セットアップに役立ちます。

于 2013-01-11T20:29:46.400 に答える