0

たとえば、特定の入力に基づいて難しい計算を行う PHP 関数があるとします。

function count_score($var1, $var2, $var3){
   // based on $var1, $var2 and $var3 we run
   // a 5000-lines long calculation,
   // resulting in one $output
   return $output;
}

さて、ここで何が起こるか:

  • 関数の実行には約 1 秒かかります
  • 入力できる $var1、$var2、および $var3 の組み合わせは多くありません (およそ 3000 程度)。

私は何ができますか:

すべての組み合わせに基づいて関数の結果を保存し、それが以前に計算されたかどうかを確認できます。これをユーザーごとに $_SESSION に保存できるので、関数が呼び出されるたびに、結果が $_SESSION で検索されます。

しかし、これらの結果をすべてのユーザーに保存したい場合はどうすればよいでしょうか? $_SESSION は、すべてのユーザーに対してサイト全体でグローバルに共有されていないため、使用できません。ではどうやって保管すればよいのでしょうか?

計算結果が異なるのは、関数を変更したときだけで、48 時間に 1 回程度です。次に、関数のリビジョンを手動で指定し、そのリビジョンの結果を確認できます。しかし、これらすべてをどのように/どこに保存しますか?

編集オプションで、メソッドは CRON (http レイヤーなし) で機能する必要がありますが、必須ではありません。

4

4 に答える 4

1

組み合わせをデータベースに保存し、その中で検索できます。したがって、ユーザー間で共有されます。

機能が変更された場合は、データベースを消去できます。

于 2013-06-20T07:43:37.727 に答える
1

一時データを memcached に保存できます。これを行うだけです。

$m = new Memcached();
$m->addServer('localhost', 11211);

$key = "count_score_result_{$var1}_{$var2}_{$var3}";
$result = $m->get($key);
if(!$result){
    $result = count_score($var1,$var2,$var3);
    $result = $m->set($key,$result,15000);
}
于 2013-06-20T07:49:03.677 に答える
0

3 つの簡単な解決策を提案します。

  1. APC - http://php.net/manual/en/book.apc.php
  2. Memcache - http://memcached.org/
  3. メモリ (MySQL ストレージ エンジン) - http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html

Memcache は使用可能なメモリを自動的に処理するため、制限を超える 1 バイトを保存しようとすると、memcache は「スペースを作る」ために最も古い保存値を削除します。APCも。

APC と Memcache の違いは、APC は個別のインストールを必要とせず、配布されないことです。そのため、APC にデータを保存して、サーバーのプールからこのデータを取得することはできません。アプリケーションが単一のサーバーで実行される場合は、これが最適なソリューションです。

メモリを使用すると、メンテナンスとセットアップが簡単な従来の MySQL テーブルを作成できます。メモリは APC や Memcache とほぼ同じくらい高速です。このストレージ エンジンでは、すべてのデータが RAM に保存されるため、サーバーを再起動すると、テーブルに保存されているすべてのデータが失われますが、非常に高速で適合します。あなたの要望。

私の意見では、APC が最適なソリューションです。

于 2013-06-20T07:52:15.363 に答える
0

組み合わせ/結果を配列に保存し、json_encode()してファイルに書き込んでみませんか。必要なときにいつでもファイルをロードし、json_decode() してください。

于 2013-06-20T07:46:17.417 に答える