0

記録のために、私は XAMPP (PHP 5.3.1) で Windows Vista を使用しています。

APC を使用してデータベースの結果をキャッシュしようとしています。文字列変数で簡単な APC テストを行ったところ、問題なく動作するようです。しかし、データベース結果リソースで同じことをしようとすると、キャッシュ内のデータを使用したいときに「有効な MySQL 結果リソースではありません」という苦情が表示されます。

これが私のコードです:

$key_hash_str = md5($query_sql_str);
$cache_res = Mox_Cache_APC::fetch($key_hash_str);;

switch(true)
{
case (!$cache_res):
    $query_result_res = self::executeQuery($query_sql_str);
    Mox_Cache_APC::store($key_hash_str, $query_result_res);
    return $query_result_res;                   
break;

default:
    return $cache_res;
}

Mox_Cac​​he_APC は私の APC クラスであり、フェッチとストアは apc_fetch() と apc_store() の単なる抽象化です。executeQuery は、このコードが記述されたクラス内で定義された静的関数です (明らかなように、Query を実行するため)。

私は何か間違ったことをしていますか?結果セットをキャッシュする前に何かする必要がありますか?

親切なアドバイス。

4

2 に答える 2

1

簡単な答え: 生の結果リソースを保存することはできません。それをネイティブ配列にフェッチして(のようなものを使用してmysql_fetch_assoc())保存することはできますが、リソースは保存できません。

しかし、なぜ MySQL のクエリ キャッシングを有効にしないのでしょうか? これとまったく同じことを行います。確かに、dbサーバーへの追加のTCPラウンドトリップが必要ですが、テーブルから行を挿入/更新/削除すると、データベースから古いキャッシュ結果が自動的に削除されます...同じサーバーで何百ものクエリを実行していない限りページ、パフォーマンスに関してはほぼ同じはずです...

于 2010-07-22T15:26:00.013 に答える
1

それは予想されることです。データベース リソースをキャッシュすることはできません。

実際、他の PHPリソースをキャッシュすることはできません。PHP リソースは特殊なタイプです。変数自体は、識別子とリソースのタイプのみを保持します。その識別子は、そのタイプのリソースを受け入れる関数で使用して、そのデータをフェッチして操作できます。ただし、PHP 自体はその値について何も知りません (値の大きさや、他のリソースに依存しているかどうかなど)。

オブジェクトの場合のように、リソースを提供する拡張機能によって実装できるシリアライゼーションの一般的なメカニズムもありません。したがって、リソースをキャッシュすることはできません。

必要に応じて、結果を配列形式でキャッシュできます。

于 2010-07-22T15:26:09.827 に答える