1

PHP サイトのすべての Web ページで使用できるようにする必要がある文字列変数が 100 個まであります。実行時にデータが変更されることはありませんが、将来的には複数のデータ セットが必要になり、ページ リクエストで使用中のデータを切り替える必要があります。文字列の長さは 5 ~ 600 文字です。現在、次のようなデータを含むファイルを含めています。

$someStuff = "abc";
$otherStuff = "def";
// etc

opcache を使用しています。このアプローチは、opcache からどの程度の利益を得るでしょうか?

私はこの答えを見ました。キャッシングの利点がキー検索を行う価値がある場合は、連想配列の使用に変更できます。ただし、変数を宣言するよりも、静的配列フィールドを持つクラスを使用する方が私の状況に適しているかどうかは明確ではありません。

たぶん、静的変数を持つ関数は良い考えですか? これは静的クラス フィールドと同じですか、それよりも優れていますか、それとも劣っていますか?

function getItem ($name) {
    static $items = array("someStuff" => "abc");
    return $items[$name];
}

たぶん、各文字列の変数ではなく関数ですか?特定のページですべての文字列が使用されていない場合 (これはよくあることです)、これはより良いことでしょうか?

function someStuff () { return "abc"; }
function otherStuff () { return "def"; }

最善の解決策は何ですか?すべてのページでデータが必要になるため、ディスク/データベースなどからの読み取りを避けて、できるだけ効率的にしたいと考えています。

4

1 に答える 1

2

実際には、次のようなことをしても違いはありません。

$someStuff = "abc";
$otherStuff = "def";
// ...

また

$constants = array(
    'someStuff' => "abc";
    'otherStuff' = >"def";
    // ...
);

または、他の回答に従って、これをクラスの静的配列にラップします。OPcache を使用すると、コンパイルのオーバーヘッドとディスク I/O のオーバーヘッドがなくなります。文字列定数をインターンするので、これらは Zend エンジンで効果的に静的に使用できます。クラス バージョンは配列構造の単一の浅いコピーを行い、他の 2 つのバージョンは ~100 の変数を初期化するために ~200 の opcode exec を実行し、実際にインターンされた文字列は参照によって効果的にコピーされます。エンジンは通常、1 秒あたり 20 ~ 40M の opcode exec を解釈するので、計算してみてください。問題ありません。

私の推奨事項は次のとおりです。ここではランタイムの問題について心配する必要はありません。最も明確で保守しやすいと思われるアプローチを選択してください。個人的には、独自の構成クラス ファイルから自動ロードされるクラスを使用しますが、これはあなたのアプリであり、あなたにとって最も明確なことを行います。

ところで、関数を使用するのは面倒で、ランタイム コストがかかります。また、関数呼び出しは最もコストのかかる PHP 操作の 1 つです。クラス定数への参照はかなり安価ですが、これらを自分でベンチマークしてみてください。ただし、繰り返しになりますが、リクエストごとにこれらの 1 万回以上を参照しない限り、実質的な違いに気付くことはありません。賢すぎると「自分の足を撃つ」ことになるだけです。:-)

于 2014-04-19T18:11:36.583 に答える