3

MySQLクエリのために遅い関数があります。
特定のMySQLテーブルが変更されていない限り、関数は同じ結果を返します。
PHP / MySQLでそのような関数を「メモ化」する最も簡単な方法は何ですか?

編集:
私が見たいのは:

  • MqSQLからのテーブルのテーブルハッシュ/最終変更日のようなもの。
  • PHP側からの何かは、関数がアクセスできるテーブルを把握し、適切な場合は結果をキャッシュ/取得するのに十分賢いです。
4

5 に答える 5

1

クエリの結果をキャッシュして、特定のテーブルが変更された場合にキャッシュをクリアしないのはなぜですか?

于 2012-07-13T15:31:03.233 に答える
1

まず最初に、結果を最初に処理するときに、結果をsemlf製の「キャッシュ」に保存するだけで済みます。次に、同じクエリを再度実行する場合は、キャッシュから結果を読み取るだけです。ただし、これは、テーブルで何も変更されていないことを知っている場合にのみ機能します。あなたは ?

それとは別に、mysqlRDMBSはそれ自体をキャッシュするのに非常に優れています。したがって、通常、同じクエリを2回実行すると、とにかく応答がはるかに速くなります。それで十分ではありませんか?

于 2012-07-13T15:33:10.067 に答える
1

ほとんどの場合、データのキャッシュ方法を探しています。

興味深いと思われるいくつかの方法を次に示します。

memcached / APC

これをサポートするホストにアクセスできる場合は、それを選択してください。これは、今日のデータを保存および取得するための単一の最速の方法です。

参照http ://www.php.net/manual/en/book.memcached.php


ファイルキャッシュ

PHPのファイルライブラリを使用して、データをファイルに保存し、必要に応じて取得できます。これは、Javascriptデータに役立つだけでなく、.jsファイルをオンデマンドで動的にロードできる場合もあります。

参照http ://www.php.net/manual/en/ref.filesystem.php


SQLキャッシング

読み取り/書き込みアクセスを容易にするために、結果を別のテーブルに保存することもできます(費用がかかり、単一のテーブルから取得していない複雑な操作を使用していると仮定します)。

参照http ://www.php.net/manual/en/ref.pdo-mysql.php


cronjobsキャッシュされたデータを時間の経過とともに削除するためにも(スペースを節約したり、キャッシュを更新したりするために)確認することをお勧めします。

参照: http: //en.wikipedia.org/wiki/Cron

楽しんで頑張ってください!

于 2012-07-13T15:33:04.520 に答える
1

私の側では、構築したカスタムMVCフレームワークを使用し、SELECTベースの関数を呼び出すたびに、その結​​果がすでに処理されているかどうかをキャッシュで調べて、単純に返します。

public static function getProductsByCategory(Activis_Catalog_Models_Category $category, array $except = array(), $limitedToActivation = true){

    //If the cache contains the request, return it
    if(isset(self::$__resultCache['getProductsByCategory'][md5(serialize(func_get_args()))])){ return self::$__resultCache['getProductsByCategory'][md5(serialize(func_get_args()))]; }

     ...... PROCESS THE FUNCTION NORMALLY ....

    self::$__resultCache['getProductsByCategory'][md5(serialize(func_get_args()))] = $objects;
    return $objects;

これは、データ(この場合はオブジェクト)をキャッシュし、後で同じ関数呼び出しが再度行われた場合にそれらを返すことができる単純なキャッシュメカニズムになります。

モデルにUPDATE/DELETE / INSERT機能がある場合は、「$ cache」をクリアすることを忘れないでください。そうしないと、変更された誤ったデータが返されます。

于 2012-07-13T15:36:19.440 に答える
0

Cachalotをご覧ください。コードは次のようになります。

$cache = new \Cachalot\ApcCache();
$products = $cache->getCached([$productRepository, 'findByCategory'], ['cars']);

さまざまなバックエンドがサポートされています:Apc、Xcache、Memcached、Redis、Couchbase。

于 2016-01-10T22:12:01.427 に答える