2012-04-28 4 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에 난 당신이 단순히 쿼리 결과 핸들이 아닌 실제 쿼리 결과 캐싱 등하고,이 생각보다 훨씬 똑똑하지 않으면 :

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

을 이 시점에서 $ res는 임의의 숫자이며, 사용자가 요청한 txt 필드가 아닙니다. 데이터를 검색하기 위해 먼저 결과에서 행을 페치 (fetch)해야합니다.

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

덕분에 프로그래밍을 중단 한 후 PHP 구문을 완전히 잊어 버렸습니다 ... 캐싱에 관해서는 mysql 리소스를 사용하면 외부에서해야 할 일을 할 수있다. :) 고마워요 –

+0

이 스크립트가 종료 된 후에 mysql 리소스가 무의미 할 것입니다. 결과 핸들은 PER-SCRIPT이며 스크립트 자체의 사적인 세계 외부에서 유지되지 않습니다. 결과 핸들을 저장할 수는 있지만 다른 스크립트가 그 핸들을 잡아 당길 때 스크립트의 실행 컨텍스트에서 잘못된 핸들이 될 것입니다. –

+0

또 다른 질문이 생깁니다. 내'lang' 쿼리는 여러 행을 가져와야한다고 가정합니다. 어떻게 모두 저장할 수 있습니까? –

관련 문제