1

次のような100k要素のかなり大きな連想配列があるとします。

$resources = array(
'stone'=>'current_stone.gif',
'stick'=>'uglystick.jpg',
...
);

resources.phpというファイルに保存され、実行時に変更されることはありません。

このデータを Zend opcache に保存して、すべてのプロセスで共有し (メモリを節約)、検索速度を向上させたいと考えています。

私の現在の仮定は、この形式では、この配列はどこにも静的構造として定義されていないため、opcache に格納されないということです。

このデータが確実に opcache に入るようにするにはどうすればよいでしょうか?

4

2 に答える 2

2

いいえ、OPcache に変数を保存することはできませんが、クラスの静的は機能します。

class Resource {
    static $image = [
        'stone'=>'current_stone.gif',
        'stick'=>'uglystick.jpg',
        ...
    ];
}
...
echo Resource::$image['stone'], "\n";

これにより、配列を初期化するすべてのオペコードが保存されますが、OPcache は SMA のコンパイル済みスクリプトの Resource::$image のバージョンをプロセス空間の対応するクラス静的プロパティにディープ コピーします。リソースを使用しているアクティブなプロセスのそれぞれの HashTable -- ただし、文字列自体はインターンされるため、このクラスを使用しているすべてのアクティブな php リクエスト間で共有されます。

クラス オートローダを使用してクラスをロードする場合は、参照以外に何もする必要はなくResoure::$image...、オートローダがマッピングを行います。

于 2013-12-30T02:29:35.773 に答える