2010-05-28 2 views
3

최근에 PHP 응용 프로그램에서 getDelayedgetMulti을 사용하는 방법에 대해 조금 생각했습니다. getDelayed에 대한 설명서를 읽기에서PHP memcached : getDelayed & getMulti - 사용 방법은 무엇입니까?

:

"방법은 응답 기다린 당신도 Memcached가가 가져 오거나 :: 전화, 항목을 수집 할 준비가되면 바로 반환하지 않습니다. Memcached :: fetchAll. "

getMulti과는 달리 키를 사용하려면 먼저 fetchAll을 호출해야합니다. 그러나 실제 memcached 콜은 언제 완료됩니까? fetchAll 또는 getDelayed을 실행할 때?

예와 업데이트 :

$this->memcached->set('int', 99); 
    $this->memcached->set('string', 'a simple string'); 
    $this->memcached->set('array', array(11, 12)); 

    $this->memcached->getDelayed(array('int')); 
    $this->memcached->getDelayed(array('string')); 
    $this->memcached->getDelayed(array('array')); 

    print("<pre>".print_r($this->memcached->fetchAll())."</pre>"); // returns the array element only. 

답변

4

Memcache의 IO는 getDelayed 또는 fetchAll 중 하나에 발생합니다.

getDelayed은 기본적으로 "나는이 키들을 원 하겠지만 지금은 필요가 없다"고 말합니다.

이 기능의 주요 이점은 PHP가 백그라운드에서 병렬 작업으로이 작업을 수행 할 수 있다는 점입니다. 나중에 프로세스에서 어떤 키가 필요한지 알고 있다면 PHP에 가서 가져 가라고 요청할 수 있으며, 필요할 때마다 fetchAll이라고 부릅니다.

PHP가 다른 일을하고있는 동안 데이터를 가져 오는 경우 fetchAll으로 전화하면 대기 할 필요가 없습니다. 그렇지 않은 경우 Memcached의 데이터 전송이 완료되는 동안 프로세스가 일시 중지됩니다.

  1. 3 초 걸렸다 이미지 크기 조정 : 당신이해야 할 두 가지가 있다면

    아주 바보 예입니다.

  2. 2 초가 걸린 memcache에서 100 개의 값을 가져옵니다.

방금 ​​이미지의 크기를 조정 한 다음 getMulti을 사용한 경우 5 초가 걸립니다.

키에 getDelayed을 입력하고 이미지의 크기를 조정 한 다음 fetchAll을 사용하면 모든 작업이 단 3 초만에 완료됩니다.

+0

안녕하세요 올리, 답변 해 주셔서 감사합니다. 내 게시물을 예제로 업데이트했습니다. 분명히 getDelayed 호출은 이전의 모든 getDelayed를 겹쳐 쓰고 마지막 호출의 값만 리턴합니다. 내 첫 번째 게시물을 확인하고 내게 당신이 생각하는 것을 알려주십시오 – Industrial

+1

그래, 내가 틀렸어. 내 대답을 업데이트 할게. – Oli

+0

걱정할 필요는 없지만 그렇다면 getMulti와 getDelayed의 차이점은 무엇입니까? :) – Industrial

3

그 사이의 배경에서 이루어지고 있습니다. 기본적으로 getDelayed를 호출하면 해당 서버의 memcache 클라이언트가 해당 키를 원한다는 사실을 알려주고 나중에 해당 키를 가져 오게됩니다. 그래서 PHP 스크립트는 memcache 클라이언트가 가져 오기를 실행하는 동안 원하는 것을 자유롭게 할 수 있습니다. 그런 다음 필요할 때 fetchAll을 호출합니다. fetchAll을 호출 할 때 모든 데이터가 이미 사용 가능하면 즉시 반환됩니다. 그렇지 않으면 모든 데이터가 준비 될 때까지 차단됩니다.

getMulti 및 fetchAll은 모두 blocking 호출입니다. 그들은 모든 데이터가 반환 될 때까지 기다립니다. getDelayed는 데이터를 가지고 있든 없든 즉시 반환한다는 점에서 비 블로킹입니다 (나중에 필요할 때 데이터를 "끌어 오기"때문에).

getDelayed를 사용하는 이유의 예는 다음과 같습니다. memcached의 대형 객체 (렌더링 된 html 페이지)가 필요할 것이라는 것을 알고 있다고 가정 해 보겠습니다. 당신이 그것을 필요로 할 것이라는 것을 알게되자 마자 getDelayed를 호출 할 수있다. 그런 다음 모든 응용 프로그램 정리 또는 로깅 또는 헤더 등을 처리 할 수 ​​있습니다. 모든 작업이 완료되면 fetchAll을 호출하여 실제로 데이터를 스크립트로 가져올 수 있습니다. 다른 모든 작업은 이미 완료되었으므로 데이터를 반향시키고 종료해야합니다.

+0

여러 개의 getDelayed 호출과 하나의 fetchAll을 사용하여 오버 헤드를 발생시키지 않고 얻을 수 있습니까? – Industrial

+0

솔직히, 나는 잘 모르겠다. 시도해보십시오. 알아내는 가장 좋은 방법입니다. 그냥 실험 해 ... – ircmaxell

관련 문제