2012-04-28 16 views
0

Memcacheでキーを設定できない問題があります。キャッシングにMemcacheでキーが設定されていません

$db=new db; 
$my_test_cache=$db->query("SELECT `txt` FROM `lang` WHERE `pg`='front' LIMIT 2", 10); 

とDBクラス:基本的に私は私のテストページを持っている

class db { 
     public function query($query, $ttl=30, $cache=true, $compr=false) { 
      global $memcache; 
      if ($cache==true) { 
       $res=$memcache->get(hash('md4', $query)); 
       if ($res!=false) { 
        echo 'this is cached'; 
        return $res; 
       } 
       else { 
        $res=mysql_query($query); 
        $memcache->set(hash('md4', $query), $res, $compr, $ttl); 
        echo 'this is not cached<hr> 
        Query: ',$query,'<br/> 
        Md4: ',hash('md4',$query),'<br/>'; 
        var_dump($res); 
        return $res; 
       } 
      } 
      else return mysql_query($query); 
      unset($res, $query); 
     } 
    } 

悲しいことに、これはすべてのリソースが正常に動作するように見えるにもかかわらず、キャッシュに任意のデータを設定しません。 AKA私のページ出力:これはクエリキャッシュされません

  • は:SELECT * langpg = 'フロント' LIMIT 2
  • MD4 FROM:34aa4e46a15413f5091dac79c9e86306
  • リソース(7)タイプの(mysqlの結果)

誰も私がここで何をすべきかについて私にお伝えするほど親切ですか?

答えて

1

タイプミス:

 if ($cache=true) { 
        ^--- should be == 

だけでなく、memcacheのは、私はそれだと思うよりもはるかに賢くない限り、あなたは、単にクエリ結果ハンドルではなく、実際のクエリ結果をcacheingしている:

 $memcache->set(hash('md4', $query), $res, $compr, $ttl); 
              ^^^^ 

その時点で、$ resはあなたが要求したtxtフィールドではなく、ランダムな数字です。あなたが最初のデータを取得するために、その結​​果から行を取得する必要があります。

 $result = mysql_query(...) or die(mysql_error()); 
     $row = mysql_fetch_assoc($result); 
     $txt = $row['txt']; 
+0

うわ、おかげで、私は完全にプログラミングから私の休憩後にPHPの構文を忘れてしまった...キャッシュ用として、私は保存したいですmysqlリソースを使用して、私は外部でそれを行う必要があるすべてを行うことができます。 :)ありがとう –

+0

このスクリプトが終了すると、mysqlリソースは無意味になります。結果ハンドルはPER-SCRIPTであり、スクリプト自身の小さな私的な世界の外には存続しません。結果ハンドルを保存することができますが、他のスクリプトがそのハンドルをプルアップすると、そのスクリプトの実行コンテキストで無効なハンドルになります。 –

+0

もう一つの疑問が生じます。私の 'lang'クエリは複数の行をフェッチすることになっていますが、どのようにそれらをすべて格納することが可能ですか? –

関連する問題