管理パネルでメインアイテムに表示するニュースアイテムの数を指定できない場合、ニュースフィードはフィードではありません。 ブログは、タイトルではなく、女の子や男の子からのさまざまな色のコメントまで、100万個のパラメーターを微調整できない場合、ブログではなく鈍いブレザーです。
これらの多数の設定はすべて一緒になって、1つの全体、つまりアプリケーションの構成、つまり構成を形成します。
構成には2つの問題があります-
1.保管方法と場所
2.入手方法と場所
これらの問題の関係は非常に明確に追跡できるため、1つに要約できます-「構成の保存方法」
Iniファイル
PHPには、iniファイルを操作するための豊富なツールキットがあり、parse_ini_file()およびparse_ini_string()の2つの関数で構成されています。
1000個の変数の設定があるとします。 簡単にするために、iniファイル内のセクションを選択しないと仮定します。
テストを繰り返したい人のために、テスト構成ファイルを生成するための最も簡単なコードの例を次に示します。
$f = fopen("./test.ini", "w");
for ( $i=1; $i<=1000; $i++ )
fwrite($f, "var_" . $i . " = \"" . md5(rand()) . "\"\n");
fclose($f);
簡単なテストコードを使用して、構成から任意の変数へのアクセス時間を決定してみましょう。
function getConfigVar($num) {
$config = parse_ini_file("./test.ini");
return $config["var_" . $num];
}
$start = microtime();
for ( $i=1; $i<=1000; $i++ )
$var = getConfigVar($i);
$end = microtime();
list($usec, $sec) = explode(" ", $start);
$start = (float)$usec + (float)$sec;
list($usec, $sec) = explode(" ", $end);
$end = (float)$usec + (float)$sec;
echo $end - $start;
テストサーバーで10回測定を行い、結果を四捨五入した後、 2.67秒になりました 。
ファイル内のシリアル化されたデータ
PHPは、任意の種類の任意のデータをテキストファイルに保存するための特別な技術であるシリアル化を提供します。 それには2つの特別な関数があります-serialize()はあらゆるタイプのデータを文字列に変換し、unserialize()はそれぞれ文字列からデータを復元します。
次のコードを使用してテストファイルを作成します。
for ( $i=1; $i<=1000; $i++ )
$data["var_" . $i] = md5(rand());
$f = fopen("./test.serial", "w");
fwrite($f, serialize($data));
fclose($f);
それに応じてgetConfigVar関数を変更します。
function getConfigVar($num) {
$config = unserialize(file_get_contents("./test.serial"));
return $config["var_" . $num];
}
残りのコードは変更せずに残します。
測定を10回行い、結果を四捨五入した後、 1.48秒を取得しました。 時間内に勝利-ほぼ2回!
プレーンPHPとしてのストレージ
ただし、前のトピックで説明した別の方法があります。 構成はPHPコードとして保存でき、アクセスにはinclude()構成を使用します。
これによりパフォーマンスが向上するかどうかを確認しましょう。
テスト構成ファイルを作成するためのコード:
$f = fopen("./test.conf", "w");
fwrite($f, "<?php\n");
for ( $i=1; $i<=1000; $i++ )
fwrite($f, "\$config['var_" . $i . "'] = \"" . md5(rand()) . "\";\n");
fwrite($f, "return \$config;\n?>");
fclose($f);
作成されたファイルの最後の行「return $ config;」に注意してください。
どうやら-関数からの戻り演算子があるのはなぜですか? 完全な秘密は、PHPのincludeステートメントは、関数のように、インクルードファイルのreturnステートメントで定義された値を返すことができるということです。 このトリックにより、グローバル変数なしで行うことができます。
テスト:
function getConfigVar($num) {
$config = include("./test.conf");
return $config["var_" . $num];
}
結果は予想外の5.21秒です。 私はこの方法が最速だと個人的に考えましたが、奇跡は起こりませんでした...
...そして、キャッシュする場合は?
それでは、最も遅い方法で、メモリ内の最も単純なキャッシュアルゴリズムを適用してみましょう。 テスト関数は次のようになります。
function getConfigVar($num) {
if ( !isset($GLOBALS['config_cache']) )
$GLOBALS['config_cache'] = include("./test.conf");
return $GLOBALS['config_cache']["var_" . $num];
}
結果は驚くべき-0.054秒です!
参考までに、キャッシングを適用した後の最初の方法は0.052秒、2番目は0.051秒という結果を示しました。
誰もが自分で結論を出すと思います。
著者は、上記のテストの人工性と緊張を知っています。 そして彼は、彼らが単に初心者プログラマーの知性を温めるためのツールとして役立つことを望んでいますが、行動への直接的なガイドではありません。
記事で引用されているすべての例は、理解を深めるために人為的に発明され、人為的に簡略化されています。