PHP의 예제 프로그램. PHP와 Memcache 사용하기 Php memcached 예제

이 글은 "응급처치"의 성격을 가지고 있습니다. 서버에 memcached를 설치하고 구성할 수 있는 특정 작업에 대한 자세한 설명입니다.

정의부터 시작해 보겠습니다.

멤캐시드- 해시 테이블을 기반으로 RAM에 데이터 캐싱 서비스를 구현하는 소프트웨어입니다.

초기 데이터:

  • VPS운영 체제에서 실행 중 데비안;
  • FTP, SSH를 통해 접속할 수 있는 유효한 웹사이트입니다.

마지막 점부터 시작해 보겠습니다. 실행 중인 인터넷 리소스(또는 이와 유사한 것) 덕분에 우리는 설치한 항목을 빠르고 쉽게 찾을 수 있습니다(아마도 memcached 등을 찾을 수 있을 것입니다). 다음과 같이 작성할 info.php라는 파일을 생성해 보겠습니다.

http://example.com/info.php로 이동하여 코드를 실행해 보겠습니다.

다른 모든 항목 중에서 유사한 항목을 찾으면 모든 것이 정상이며 작업이 이미 완료된 것입니다. 그렇지 않으면 이 출판물에 설명된 조치를 기반으로 이 결과를 얻게 됩니다.

Memcached 서버 설치

명령어로 설치를 시작해보자

Apt-get memcached 설치 php5-memcache

설치가 완료되기를 기다리고 있습니다. 그런 다음 명령으로 결과를 확인하겠습니다. netstat

결과적으로 우리는 다음을 얻습니다:

Tcp 0 0 *:11211 *:* LISTEN 13053/memcached

보시다시피, 기본적으로 memcached는 포트 11211을 "수신"합니다. 따라서 이 포트를 통해 누구든지 memcached 서버에 연결하여 사용할 수 있습니다. 이 권한을 우리 서버(localhost)에만 부여하여 우리 자신을 보호합시다. 제어판이나 콘솔을 통해 /etc/memcached.conf 파일을 엽니다.

Vi /etc/memcached.conf

이 파일에는 자세한 설명이 포함되어 있습니다. 꼭 확인해 보세요.

-l 127.0.0.1 줄을 추가합니다.

다음 명령을 사용하여 memcached 서버를 재부팅합니다.

/etc/init.d/memcached 재시작

그리고 다시 확인해 봅시다:

Netstat-탭 | grep memcached

결과적으로 우리는 다음과 같은 것을 얻어야 합니다.

Tcp 0 0 localhost.localdo:11211 *:* LISTEN 13092/memcached

이제 memcached는 로컬 서버에서만 작동합니다.

멤캐시 설치

명령 목록(memcache 버전은 다를 수 있습니다!):

Apt-get 설치 php5-dev libmemcache-dev pecl 다운로드 memcache tar xzvf memcache-2.2.6.tgz cd memcache-2.2.6/ phpize && ./configure --enable-memcache && cp 모듈/memcache.so /usr/ 만들기 lib/php5/20060613/ echo "extension=memcache.so" >> /etc/php5/apache2/php.ini

아파치를 다시 시작하십시오:

Apachectl 우아한

이전에 http://example.com/info.php에 게시한 스크립트를 확인해 보겠습니다. 이제 거기서 Memcache 항목을 찾아야 합니다.

Memcached의 동작을 확인해 보자

result.php 파일을 생성하고 실행해 보겠습니다.

connect("localhost", 11211) 또는 exit("Memcached 서버에 연결할 수 없습니다."); $version = $memcache->getVersion(); echo "서버" 버전: ".$version."
\n"; $tmp_object = 새로운 stdClass; $tmp_object->str_attr = "test"; $tmp_object->int_attr = 123; $memcache->set("key", $tmp_object, false, 10) 또는 die("Not Memcached에 항목을 남겼습니다."); echo "Memcached 캐시에 데이터를 씁니다(데이터는 10초 동안 저장됩니다).
\n"; $get_result = $memcache->get("key"); echo "Memcached에 기록된 데이터:
\n"; var_dump($get_result); ?>

스크립트 결과:

서버 버전: 1.4.13 Memcached 캐시에 데이터 쓰기(데이터는 10초 동안 저장됨) Memcached에 쓰여진 데이터: object(stdClass)#3 (2) ( ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) )

모든 것이 이렇습니까, 아니면 거의 이렇습니까? 그러면 모든 것이 괜찮습니다. 그렇지 않은 경우 절차를 반복해 보십시오.

Memcache 모듈은 Memcached 캐싱 엔진에 편리한 절차적 및 객체 지향 인터페이스를 제공합니다. Memcache는 로드가 많은 동적 웹 애플리케이션의 데이터베이스 로드를 줄이기 위해 특별히 설계된 매우 효율적인 캐싱 데몬입니다.

Memcache 모듈은 세션 핸들러도 제공합니다. Memcached에 대한 자세한 내용은 memcached.org에서 확인할 수 있습니다.

원칙적으로 러시아어로 된 설치 및 구성에 대한 설명이 이미 준비되어 있으므로 익숙해질 수 있습니다.

변수, 객체, 배열 등 모든 유형의 데이터를 캐시에 저장할 수 있다는 점을 명심하세요. 하지만 자원은 아닙니다!

객체에 속성(예: 데이터베이스에 대한 연결과 같은 리소스)이 포함되어 있거나 유사한 속성을 가진 다른 객체가 포함되어 있는 경우 이 상황은 예를 들어 이 리소스가 필요한 __sleep() 메서드를 재정의하여 별도로 처리되어야 합니다. "죽이고" 이 리소스를 재생해야 하는 __wakeup 메서드()입니다.

실제로 이러한 모든 방법은 세 그룹으로 나눌 수 있습니다.

  1. 값 작업
  2. 서버 및 연결 작업
  3. 정보 수신

값 작업

이 그룹의 방법을 사용하면 다음을 수행할 수 있습니다.

  • 값 설정
  • 이 값 삭제
  • 이 값을 바꾸세요
  • 키로 이 값에 액세스
  • 가치 수명 관리

정수 값을 증가 및 감소시키는 몇 가지 특정 방법입니다.

멤캐시::세트()
멤캐시::추가()

값을 설정하고 이 값에 대한 압축 및 수명을 설정할 수 있습니다. 이러한 메서드 동작의 유일한 차이점은 동일한 키를 가진 값이 이미 설정된 경우 Memcache::add 메서드가 FALSE를 반환한다는 것입니다.

부울 멤캐시::추가
부울 멤캐시::설정(문자열 $key , 혼합 $var [, int $flag [, int $expire ]])

  • string $key는 값의 키입니다. 이를 사용하여 값에 대해 작업합니다.
  • $var 혼합 - 값.
  • 상수
connect("로컬호스트", 11211, 30); $cache->add("myfirst", 1000, MEMCACHE_COMPRESSED, 15); $cache->set("mysecond", 2000, MEMCACHE_COMPRESSED, 15);

멤캐시::get()

요청된 값을 반환하거나, 실패하거나 해당 키가 있는 값이 아직 설정되지 않은 경우 FALSE를 반환합니다.

값 키 배열을 전달하면 Memcache::get도 배열을 반환하며, 여기에는 발견된 키-값 쌍이 포함됩니다.

경고!

키 이름에 백슬래시가 포함된 경우 작업 결과는 예측할 수 없습니다!

Memcached에도 몇 가지 문제가 있습니다. 일부 보고서에 따르면 (때때로) 버퍼 오버플로 오류가 발생하기 쉽습니다., 이는 때때로 [일부] 데이터를 덮어쓰게 되어 구조를 역직렬화할 수 없게 만드는 경우가 있으므로 Memcache::get이 배열이나 객체를 검색한 결과 bool, dobule 또는 long을 반환하는지 확인하세요. 그러면 문제가 발생한 것입니다.

멤캐시::가져오기(문자열 $key [, int &$flags ])
정렬 멤캐시::가져오기(배열 $keys [, 배열 &$flags ])

  • string $key - 값 키 또는 값을 가져와야 하는 키 배열입니다.
  • int $flag - 이 매개변수의 목적은 나에게 여전히 미스터리로 남아 있습니다. 일부 정수 값을 사용해 보았지만 아무런 효과가 없었습니다. 그리고 예제는 대부분 그것을 사용하지 않고 제공되었으며, 그로부터 나는 결론을 내렸습니다. 그것 없이도 잘 작동할 수 있습니다 :)
connect("로컬호스트", 11211, 30); $cache->add("myfirst", 1000, MEMCACHE_COMPRESSED, 15); $cache->set("mysecond", 2000, MEMCACHE_COMPRESSED, 15); print_r($cache->get(array("myfirst","mysecond")));

결과:

배열( => 1000 => 2000)

멤캐시::삭제()

캐시에서 값을 제거합니다.

논평:

이 방법이 항상 작동하는 것은 아닙니다(소프트웨어 버전에 따라 다름)! 페이지 끝에는 Memcache::delete가 작동하는 경우와 작동하지 않는 경우가 있습니다.

음, 유일하게 안정적인 옵션은 불필요한 값을 재설정하는 것입니다.

$cache->set("3", NULL);

마이너스가 하나뿐입니다. 이 경우 키는 아무데도 가지 않습니다.

멤캐시::삭제(문자열 $key [, int $timeout = 0 ])

  • string $key - 삭제할 키 값입니다.
  • int $timeout - 이 매개변수도 더 이상 사용되지 않으며 지원되지 않으며 기본값은 0초입니다. 이 옵션을 사용하지 마십시오.

멤캐시::replace()

기존 값을 덮어씁니다.

Memcache::replace()를 사용하여 교체해야 합니다. 기존 가치. 해당 키가 포함된 값이 없으면 Memcache::replace()는 FALSE를 반환합니다. 그렇지 않으면 Memcache::replace()는 Memcache::set()과 동일하게 동작합니다. memcache_replace() 함수를 사용할 수도 있습니다.

멤캐시::교체(문자열 $key , 혼합 $var [, int $flag [, int $expire ]])

  • string $key - 값을 교체해야 하는 키입니다.
  • $var 혼합 - 새 값.
  • int $flag - 저장된 값에 압축을 사용할지 여부를 나타내는 플래그(여기서 Zlib가 사용됨), 상수를 사용할 수 있습니다.
  • int $expire - 값(캐시)의 수명입니다. 0과 같으면 무기한입니다. 현재 시간 이후의 타임스탬프나 초 수를 사용할 수도 있지만 초 수는 2592000(30일)을 초과할 수 없습니다.
connect("로컬호스트", 11211, 30); $cache->add("하나", 111, 0, 15); $cache->add("두", 222, 0, 15); $cache->add("3", 333, 0, 15); $cache->replace("세", 777); print_r($cache->get(array("하나","둘","셋"))); 배열 ( => 111 => 222 => 777)

Memcache::증분()

지정된 키의 값을 지정된 값만큼 증가시킵니다. 지정된 키의 값이 숫자가 아니고 숫자로 변환할 수 없는 경우 해당 값을 두 번째 매개변수로 지정된 값으로 변경합니다. Memcache::increment()는 요소가 아직 존재하지 않는 경우 요소를 생성하지 않습니다.

압축된 값(MEMCACHE_COMPRESSED 플래그로 설정)과 함께 Memcache::increment()를 사용하는 것은 권장되지 않습니다. 나중에 Memcache::get()을 사용하여 해당 값을 얻으려고 시도할 때 놀랄 일이 발생하기 때문입니다.

개인적으로 확인해봤는데 어떤 결함도 발견되지 않았습니다 :)

정수 Memcache::증분

  • string $key - 값을 증가시켜야 하는 키입니다.
  • int $value - 증분 값.
connect("로컬호스트", 11211, 30); $cache->set("someOne", 10, 0, 5); $cache->increment("someOne", 10, 0, 5); $cache->increment("someOne", 10, 0, 5); echo $cache->get("someOne");// 30을 인쇄합니다.

Memcache::감소()

지정된 키의 값을 지정된 값만큼 감소시킵니다. Memcache::increment()와 유사하게 요소의 현재 값은 숫자 값으로 변환된 다음 감소됩니다.

정수 Memcache::감소(문자열 $key [, int $value = 1 ])

  • string $key - 값을 감소시켜야 하는 키입니다.
  • int $value - 값 감소.

멤캐시::플러시()

Memcache::flush()는 모든 기존 값을 무효화합니다. Memcache::flush()는 실제로 메모리 리소스를 해제하지 않고 모든 요소를 ​​더 이상 사용되지 않는 것으로 표시하여 점유된 메모리를 새 값으로 사용할 수 있도록 합니다. 또한 memcache_flush() 함수를 사용할 수도 있습니다.

부울 Memcache::플러시(무효의)

아래 예제에서는 아무 것도 출력되지 않습니다.

connect("로컬호스트", 11211, 30); $cache->set("someOne", 111, 0, 5); $cache->set("someTwo", 222, 0, 5); $cache->set("someTree", 333, 0, 5); $캐시->플러시(); //캐시 지우기 print_r($cache->get(array("someOne","someTwo","someTree")));

서버 및 연결 작업.

Memcache는 단일 서버 또는 서버 풀(세트)에서 작동할 수 있습니다.

캐시를 제공하기 위해 하나의 서버만 사용하는 경우 작업을 초기화하려면 캐시 개체를 만들고 메서드를 사용하기만 하면 됩니다. 멤캐시::연결

서버 풀을 생성하려면 먼저 캐시 객체를 생성한 다음 Memcache::추가서버필요한 수의 서버를 추가하십시오.

멤캐시::연결()

Memcached 서버에 대한 연결을 설정합니다. Memcache::connect()를 사용하여 열린 연결은 스크립트가 완료되면 자동으로 닫히지만 Memcache::close()를 사용하여 명시적으로 닫을 수 있습니다. memcache_connect() 함수를 사용할 수도 있으며 성공 시 TRUE를, 오류 시 FALSE를 반환합니다.

부울 멤캐시::연결

connect("로컬호스트", 11211, 30);

멤캐시::pconnect()

이 메서드는 지속적인 연결을 설정한다는 점만 제외하면 Memcache::connect()와 유사합니다. 스크립트가 완료되고 Memcache::close()가 호출될 때 이 연결은 닫히지 않습니다. memcache_pconnect() 함수를 사용할 수도 있으며 성공 시 Memcache 객체를 반환하고 오류 시 FALSE를 반환합니다.

혼합된 멤캐시::pconnect(문자열 $host [, int $port [, int $timeout ]])

  • 이 매개변수는 unix:///path/to/memcached.sock와 같은 다른 전송을 지정할 수도 있습니다. UNIX 소켓을 사용하십시오. 이 경우 포트는 0으로 설정되어야 합니다.
  • 소켓을 사용하려는 경우 이 매개변수를 0으로 설정하십시오.
  • int $timeout - 데몬 연결에 대한 제한(초)입니다. 기본값인 1초를 변경하기 전에 다시 한번 생각해 보십시오. 연결 시간이 너무 오래 걸리면 캐싱의 모든 이점을 잃을 수 있습니다.
pconnect("로컬호스트", 11211, 30);

멤캐시::close()

Memcached 서버에 대한 연결을 닫습니다. 이 기능은 웹 서버가 종료/다시 시작될 때만 닫히는 영구 연결을 닫지 않습니다. memcache_close() 함수를 사용할 수도 있습니다.

부울 멤캐시::닫기(무효의)

멤캐시::추가서버()

연결 풀에 서버를 추가합니다. Memcache::addServer()를 사용하여 열린 연결은 스크립트가 완료되면 자동으로 닫히거나 Memcache::close()를 사용하여 수동으로 닫을 수 있습니다. memcache_add_server() 함수를 사용할 수 있습니다.

Memcache::addServer(Memcache::connect() 및 Memcache::PConnect()와 반대)를 사용하는 경우 실제로 필요할 때까지 네트워크 연결이 설정되지 않습니다. 이렇게 하면 전혀 필요하지 않더라도 많은 수의 서버를 풀에 추가할 때 오버헤드가 발생하지 않습니다.

서버 풀은 더 높은 내결함성을 제공합니다. 소켓 오류 또는 서버 수준 Memcached 오류(메모리 오류 제외)로 인해 리소스 재할당이 발생합니다. 기존 키 추가와 같은 클라이언트 오류로 인해 오류가 발생하지 않습니다.

논평:

성공하면 TRUE를 반환하고, 오류가 발생하면 FALSE를 반환합니다.

부울 Memcache::추가서버(string $host [, int $port = 11211 [, bool $percious [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callable $failure_callback [, int $timeoutms ]]]] ]]]])

  • string $host - Memcached 호스트. 이 매개변수는 unix:///path/to/memcached.sock와 같은 다른 전송을 지정할 수도 있습니다. UNIX 소켓을 사용하십시오. 이 경우 포트는 0으로 설정되어야 합니다.
  • int $port - Memcached가 연결을 수신하는 포트입니다. 소켓을 사용하려는 경우 이 매개변수를 0으로 설정하십시오.
  • bool $persist - 영구 연결 사용을 설정합니다. 기본값은 TRUE입니다.
  • int $weight - 값이 클수록 이 서버가 값을 저장하도록 선택될 가능성이 높아집니다. 저것들. 이는 일반 풀에 있는 서버의 일종의 "가중치"이며, 간접적으로는 서버의 예상 부하이기도 합니다.
  • int $timeout - 데몬 연결에 대한 제한(초)입니다. 기본값인 1초를 변경하기 전에 다시 한번 생각해 보십시오. 연결 시간이 너무 오래 걸리면 캐싱의 모든 이점을 잃을 수 있습니다.
  • 문자열 $timeoutms - 설명되지 않았습니다.

정보 수신

Memcache::getExtendedStats()

서버 통계의 2차원 연관 배열을 반환합니다. 서버 호스트:포트 키의 배열입니다. 값에는 개별 통계 매개변수가 포함되어 있습니다. 실패한 서버의 값은 FALSE입니다. memcache_get_extended_stats() 함수를 사용할 수도 있습니다.

논평:

이 기능은 버전 2.0.0의 Memcache에 추가되었습니다.

정렬 Memcache::getExtendedStats([ 문자열 $type [, int $slabid [, int $limit = 100 ]]])

그리고 이제 농담입니다.

보안상의 이유로 Memcached에서 "cachedump" 통계 유형이 제거되었습니다.

정보 출력의 예(매개변수 없이 호출):

배열 (=> 배열 (=> 5179 => 966862 => 1336505233 => 1.4.5 => 64 => 160.302880 => 483.975109 => 6 => 358080 => 13 => 15037476 => 3501979 => 46 => 1 1507898 => 3529578 => 0 => 0 => 0 => 76 => 0 => 0 => 0 => 0 => 0 => 0 => 0 => 1643906080 => 11298732744 => 67108864 => 1 = > 0 => 4 => 0 => 3295454 => 7623 => 3501915 => 0 => 1825755) ...)

멤캐시::getServerStatus()

서버의 온라인/오프라인 상태를 반환합니다. 기능을 사용할 수도 있습니다. memcache_get_server_status()

논평:

이 기능은 버전 2.0.0의 Memcache에 추가되었습니다.

정수 Memcache::getServerStatus(문자열 $host [, int $port = 11211 ])

  • string $host - Memcached 호스트.
  • int $port - Memcached가 연결을 수신하는 포트입니다.

멤캐시::getStats()

서버 통계가 포함된 연관 배열을 반환합니다. 통계 매개변수에 해당하는 키 배열과 매개변수 값에 대한 값입니다. 기능을 사용할 수도 있습니다. memcache_get_stats()

정렬 Memcache::getStats s ([ 문자열 $type [, int $slabid [, int $limit = 100 ]]])

  • string $type - 통계 유형. 유효한 값: (재설정, malloc, 맵, 캐시 덤프, 슬래브, 항목, 크기) Memcached 프로토콜 사양에 따르면 이러한 추가 인수는 "개발자의 편의를 위해 수정될 수 있습니다."
  • int $slabid - 첫 번째 매개변수가 "cachedump"로 설정된 경우 디버깅에 사용할 서버를 지정하는 데 사용됩니다.
  • int $limit - 덤프의 항목 수를 제한하기 위해 첫 번째 매개변수가 "cachedump"로 설정된 경우 사용됩니다.

멤캐시::getVersion()

문자열(서버 버전 번호)을 반환합니다. 또한 당신은 기능을 사용할 수 있습니다 memcache_get_version().

Memcache::getVersion(무효의)

Memcache::setCompressThreshold()

큰 값의 자동 압축을 제공합니다. 기능을 사용할 수도 있습니다. memcache_set_compress_threshold()

논평:

이 기능은 버전 2.0.0의 Memcache에 추가되었습니다.

부울 Memcache::setCompressThreshold(int $threshold [, float $min_savings ])

  • int $threshold - 자동으로 압축해야 하는 값의 최소 길이입니다.
  • float $min_savings - 압축 비율을 설정합니다. 지정된 값은 0과 1 사이여야 합니다. 기본값은 0.2로 최소 20%의 압축 절감 효과를 제공합니다.

Memcache::setServerParams()

런타임 시 서버 매개변수를 변경합니다. 기능을 사용할 수도 있습니다. memcache_set_server_params().

성공하면 TRUE를 반환하고, 오류가 발생하면 FALSE를 반환합니다.

논평:

이 기능은 버전 2.0.0의 Memcache에 추가되었습니다.

부울 Memcache::setServerParams(문자열 $host [, int $port = 11211 [, int $timeout [, int $retry_interval = false [, bool $status [, callable $failure_callback ]]]]])

  • string $host - Memcached 호스트.
  • int $port - Memcached가 연결을 수신하는 포트입니다.
  • int $timeout - 데몬 연결에 대한 제한(초)입니다. 기본값인 1초를 변경하기 전에 다시 한번 생각해 보십시오. 연결 시간이 너무 오래 걸리면 캐싱의 모든 이점을 잃을 수 있습니다.
  • int $retry_interval - 실패한 서버가 폴링되는 빈도를 설정합니다. 기본값은 15초입니다. 이 매개변수를 -1로 설정하면 요청 자동 재시도가 비활성화됩니다.
  • bool $status - 서버를 ONLINE으로 표시합니다. 이 매개변수를 FALSE로 설정하고 retry_interval -1을 사용하면 키 할당 알고리즘에 영향을 주지 않도록 실패한 서버를 활성 서버 풀에 보관할 수 있습니다. 이 서버에 대한 요청은 사용 가능한 나머지 서버에 분산됩니다. 기본값은 TRUE입니다. 이는 서버가 온라인으로 간주되어야 함을 의미합니다.
  • callable $failure_callback - 사용자가 오류가 감지될 때 실행할 콜백 함수를 지정할 수 있습니다. 이 함수는 실패한 서버의 호스트 이름과 포트라는 두 개의 매개 변수를 사용해야 합니다.

초보자를 위한 기사. Memcached는 서버의 RAM에 데이터를 캐싱하는 것입니다.

점은 무엇인가? 사이트는 일반적으로 데이터베이스에서 데이터를 가져오고 데이터베이스는 디스크에 있는 큰 파일이며 디스크에서 읽는 것은 메모리에서 읽는 것보다 우선적으로 느립니다. 참석자가 수만 명을 초과하고 데이터베이스의 테이블이 수십만 행으로 늘어나자마자 이는 즉시 나타나지 않습니다. 더욱이 데이터베이스 자체는 정의상 비효율적입니다. 데이터베이스에 1,000,000개의 게시물을 저장했지만 지난 며칠 동안 전체 조회수의 95%가 게시물 100개에 불과했다고 가정해 보겠습니다. 그러나 거대한 데이터베이스 파일에 들어가서 자주 요청되는 여러 레코드를 찾아야 할 때마다 서버의 부하가 증가하고 사이트를 여는 데 걸리는 시간이 늘어납니다. 이러한 항목을 캐시에 넣으면 사이트 속도가 빨라지고 강력한 서버를 구입할 필요가 없습니다. 한마디로, 현금은 이익이다!

캐싱은 다양한 형태로 제공됩니다. 가장 간단한 것은 캐싱입니다. 단점은 데이터가 여전히 디스크에 저장되어 있어 심각한 결과를 초래할 수 있다는 것입니다. 중간 결과를 데이터베이스에 캐시할 수 있습니다. 예를 들어 일부 포럼 엔진의 검색 결과는 데이터베이스에 저장됩니다. 글쎄요, 가장 효과적인 것은 물론 RAM에 저장하는 것입니다. 이를 위한 타사 프로그램이 많이 있습니다: Memcached, eAccelerator, APC, XCache. 그건 그렇고, MySQL은 캐시에 데이터를 저장할 수도 있습니다(우리는 메모리의 인덱스에 대해 이야기하지 않습니다).

일반적으로 그들은 하나의 서버를 사용하는 경우 eAccelerator와 XCache가 Memcached보다 더 효율적이라고 기록합니다. Memcached의 경우 TCP 연결을 열어야 하기 때문입니다. 그러나 Memcached에는 여러 서버에 데이터를 배포할 수 있다는 주요 이점이 있습니다. 예를 들어 LiveJournal 캐시는 가장 강력한 서버의 메모리에도 맞지 않습니다. 실제로 Memcached는 LiveJournal용으로 개발되었으므로 데이터를 여러 서버에 저장할 수 있습니다. 하지만 우리 초보자들에게는 아직 생각하기 이르다.

멤캐시드의 특징

  • 간단한 데이터 저장 구조(키-값).
  • 최대 캐시 수명은 30일입니다.
  • 한 요소의 최대 볼륨은 1Mb입니다.
  • 객체와 배열을 있는 그대로 저장할 수 있습니다. 파일이나 데이터베이스에 캐싱하는 경우 저장하기 전에 직렬화를 사용하여 이러한 항목을 문자열에 넣어야 합니다.
  • 인증이 없습니다(비밀번호 로그인). 저것들. 서버에 Memcached가 있으면 동일한 서버의 모든 사용자가 해당 서버에 액세스할 수 있습니다.
  • 데이터 액세스 속도는 캐시의 요소 수에 따라 달라지지 않습니다. 예 예 정확합니다.

설치

Unix든 Windows든 인터넷에는 많은 설치 지침이 있습니다. Memcached 자체 외에도 PHP를 통해 Memcached에 액세스하기 위한 lib도 설치해야 합니다(MySQL 데이터베이스와 유사하게 데이터베이스 자체 외에도 mysql 또는 mysqli 확장도 설치해야 함).

하지만 가장 쉬운 방법은 호스팅 업체에 편지를 보내는 것입니다. fastvps에서는 서버 주문 시 기본적으로 Memcached가 설치됩니다. 가장 중요한 것은 캐시에 할당해야 하는 메모리 양을 나타내는 것입니다. 기본적으로 67MB입니다. RAM이 4GB이므로 1GB를 안전하게 할당할 수 있습니다. 일반적으로 캐시에 필요한 메모리 양을 추정하는 가장 쉬운 방법은 데이터베이스 크기에 2를 곱하는 것입니다. 예를 들어 모든 사이트의 데이터베이스 무게는 300MB이며 캐시에 600MB를 할당합니다. 여유를 두고 1GB를 사용하는 것이 좋습니다.

Memcached는 phpinfo에서 볼 수 있습니다.

시험

일반적으로 Memcached는 localhost에서 실행되며 포트 11211을 통해 액세스할 수 있습니다.
통계를 살펴보자

connect("localhost",11211); print_r($memcache->getStats()); ?>

결과:
정렬
=> 5915
=> 583
=> 1309538445
=> 1.2.2
=> 64
=> 0.000000
=> 0.004000
=> 0
=> 0
=> 0
=> 1
=> 2
=> 2
=> 0
=> 0
=> 0
=> 0
=> 0
=> 7
=> 0
=> 1073741824
=> 1
)

시간이 지나면 통계는 다음과 같이 보일 것입니다.

정렬
=> 5915
=> 6202245
=> 1315740107
=> 1.2.2
=> 64
=> 3.464216
=> 10.868679
=> 298
=> 17728
=> 120366
=> 1
=> 28654
=> 4
=> 133296
=> 17728
=> 124758
=> 8538
=> 0
=> 11125692
=> 103815319
=> 1073741824
=> 1
)

기본 매개변수:
=> 298 - 캐시에 현재 요소가 몇 개 있습니까?
=> 17728 - 캐시에 있는 총 요소 수(삭제된 요소 포함)
=> 120366 - 현재 캐시에 있는 바이트 수
=>1073741824 - 일반적으로 캐시에 사용할 수 있는 바이트 수(여기서는 1Gb)
=> 124758 - 캐시에서 데이터를 가져온 횟수
=> 8538 - 캐시에서 데이터를 가져오려고 시도했지만 데이터가 없거나 캐시 수명이 만료된 횟수입니다.

get_misses/get_hits 비율은 캐시 사용의 효율성을 보여줍니다. 크기가 작을수록 캐시가 더 효율적으로 사용됩니다. 이 경우 데이터의 93%가 캐시에서 가져오는 것을 알 수 있습니다. get_misses/get_hits=1이면 뭔가 잘못하고 있는 것입니다(캐시 수명을 너무 낮게 설정했을 가능성이 높습니다).

시각적 통계
위의 코드는 print_r()과 같은 건식 형식으로 통계를 표시합니다.
아름다운 통계 출력이 있습니다 - phpMemcachedAdmin

이것은 일반 PHP 스크립트입니다. 귀하의 웹 사이트에서 그것을 열면 아름다운 디자인을 얻을 수 있습니다.
아무것도 구성할 필요가 없습니다. 기본적으로 localhost:11211에 연결됩니다.
공식 페이지에서 다운로드하실 수 있습니다.

Memcache 사용 예

"test111"이라는 문자열이 있고 이를 1일 동안 캐시하려고 한다고 가정해 보겠습니다. 이에 대한 일종의 키 "key1"을 생각해 보겠습니다.

connect("localhost",11211); $memcache->set("key1", "test111", false, 86400); // 1일 동안 캐시합니다. $get_result = $memcache->get("key1"); // 데이터 가져오기 print_r($get_result); ?>

좀 복잡하게 만들어보자

get($key)) ( $get_result = $memcache->get($key); print_r($get_result); ) else ( $result = "test222"; // $result는 일부 계산의 결과이거나 다음의 샘플입니다. 데이터베이스 $memcache->set($key, $result, false, 86400); echo "1일 동안 캐시가 기록되었습니다."; ) ?>

이 스크립트를 두 번째로 실행해야만 데이터가 표시됩니다.

또한 캐시 수명에 대해 추가하는 것을 잊었습니다. Memcached의 수명 제한은 1개월입니다. 따라서 365일을 설정하면 Memcached는 해당 날짜를 저장하지 않으며 오류도 발생하지 않습니다. 따라서 데이터가 오랫동안 변경되지 않고 최대 수명을 설정하려면 false를 지정하십시오.
$memcache->set($key, $result, false, false);

키 이름 지정의 특징. 최대 키 길이는 250자이고 공백을 사용할 수 없으므로 md5(key)를 키로 사용하는 것이 좋습니다. 조건이 포함된 SQL 쿼리를 캐시하면 키는 $key = "blog_id_1 WHERE Activity=1 AND ... AND ... LIMIT 10"과 같습니다.

또한 캐시가 속한 사이트를 결정하는 일종의 상수를 키에 추가해야 합니다.
$key = md5(PROJECT."key2"); // 여기서 상수는 PROJECT="site.com"입니다.

그렇지 않으면 동일한 서버의 두 번째 사이트가 동일한 키로 첫 번째 사이트의 데이터를 덮어쓸 수 있습니다. 사실 Memcached에는 데이터베이스와 같은 권한이 없으므로 이러한 방식으로 액세스를 제한해야 합니다. 간단히 말해서, Memcached는 키-값 쌍의 큰 덤프입니다. 따라서 모든 사이트는 하나의 Memcached에 캐시를 저장합니다. 동시에, 예를 들어 마지막 10개의 기록된 요소(예: LIMIT 10 데이터베이스)를 가져올 수 없습니다. Memcached의 구조는 매우 단순하지만 이로 인해 높은 성능을 얻을 수 있습니다.

태그 지정

Memcached는 매우 간단하기 때문에(데이터가 어떤 방식으로든 상호 연결되지 않고 키-값 관계만 있음) 실제로 몇 가지 어려움이 발생합니다. Habré와 같은 블로그가 있다고 가정해 보겠습니다. 게시물을 작성하여 캐시에 저장했습니다. 우리는 게시물 자체를 위한 캐시, 이 게시물이 표시되는 블로그를 위한 캐시, 라이브 방송을 위한 캐시, 사용자 프로필에 사용자의 게시물을 표시하기 위한 캐시 등 여러 키-값 쌍을 만들었습니다.

$memcache->set("post_id_2211", "데이터");
$memcache->set("post_blog_id_11", "데이터");
$memcache->set("live_posts", "data");
$memcache->set("post_user_id_331", "데이터");

그런데 갑자기 운영자가 해당 게시물을 삭제했습니다. 이 게시물과 관련된 모든 캐시를 지워야 합니다.

$memcache->delete("post_id_2211");
$memcache->delete("post_blog_id_11");
$memcache->delete("live_posts");
$memcache->delete("post_user_id_331");

간단히 말해서 Memcached의 단순성으로 인해 추가 코드를 수동으로 생성해야 합니다. 더욱이 우리는 어떤 캐시가 다른 캐시와 연관되어 있는지 지속적으로 기억해야 합니다. 문제에 대한 해결책은 매우 간단합니다. 우리는 각 캐시 요소에 하나 또는 여러 개의 태그를 첨부합니다.
더 많은 내용을 읽을 수 있습니다.

관행

실제로는 순수한 Memcached를 사용하는 사람이 없습니다. 일반적으로 태그 지정을 지원하는 일종의 래퍼 클래스를 사용합니다. 가장 일반적인 솔루션은 ZendCache입니다.

모든 예제가 포함된 하나의 아카이브로 다운로드
lib 폴더에 ZendCache 클래스를 넣자

루트에서 볼 때 구조는 다음과 같아야합니다
/lib/DklabCache/...
/class/Cache.class.php
/stat.php
/get_post.php
/update_post.php

ZendCache를 사용하는 래퍼 클래스(또는 래퍼라고도 함)

array(array("호스트" => MEMCACHED_HOST, "포트" => MEMCACHED_PORT, "지속적" => false),), "압축" => false,); self::$instance = 새 캐시; self::$instance->memcache = new Dklab_Cache_Backend_TagEmuWrapper(new Zend_Cache_Backend_Memcached($aConfigMem)); ) else ( NULL 반환; ) ) return self::$instance; ) 공용 함수 get($key) ( return $this->memcache->load($key); ) 공용 함수 set($key, $value, $tags=array(), $timeLife=false) ( return $this ->memcache->save($value, $key, $tags, $timeLife); ) 공용 함수 delete($key) ( $this->memcache->remove($key); ) 공용 함수 clean($cMode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) ( return $this->memcache->clean($cMode,$tags); ) 공용 함수 __construct() ( ) 공용 함수 __clone() ( ) ) ?>

이것은 간단히 말해서 첫 번째 호출에서 클래스의 인스턴스가 생성되고(읽기, Memcached에 연결) 다음 호출에서 사용되는 싱글톤 클래스입니다. 따라서 하나의 스크립트 내에서 불필요한 연결을 생성하지 않고 리소스를 절약합니다.

CACHE_USE 상수는 구성에서 별도로 지정됩니다. 이를 사용하면 캐싱을 활성화/비활성화할 수 있습니다.

"compression" => false 매개변수는 캐시의 데이터를 압축하지 않음을 의미합니다. 메모리 공간을 절약하려면 압축이 필요하지만 압축에는 시간이 걸립니다. 따라서 메모리 양이 중요하지 않은 경우 더 간결하게 비활성화합니다.

"percious" => false 매개변수는 지속적인 연결을 비활성화함을 의미합니다(mysql_pconnect()와 유사).

그런데 여기에서 여러 서버를 사용하는 방법을 볼 수 있습니다. 서버가 1개라면

"서버" => array(array("호스트" => "localhost", "포트" => 11211, "영구" => false),)

예를 들어 Memcached 서버가 3개 있다고 가정합니다.

"서버" => array(array("호스트" => "11.33.45.11", "포트" => 11211, "지속적" => false), array("호스트" => "11.33.45.12", "포트 " => 11211, "지속적" => false), array("호스트" => "11.33.45.13", "포트" => 11211, "지속적" => false),)

좋은 의미에서는 이러한 항목을 클래스에서 구성으로 옮겨야 합니다.

이제 이 클래스를 무언가를 캐시하려는 스크립트에 연결합니다.
사후 출력 스크립트를 가정해 보겠습니다(아카이브에서는 get_post.php입니다).
예제는 확실히 최고는 아니지만 전혀 없는 것보다는 낫습니다.
문제가 덜 발생하도록 특별히 데이터베이스 작업을 비활성화했습니다.

get($key_cache)))( echo "캐시에서 가져온 데이터"; return $data; ) else ( // 데이터베이스에서 게시물 찾기(select 실행) //$data = $DB->selectRow("SELECT * FROM post WHERE id=?d", $postID); // 예제를 단순화하기 위해 미리 만들어진 배열을 사용합니다(게시물은 ID=3인 블로그에 연결되어 있습니다) $data = array("id"=>$ postID, "blog_id"=>3, "title "=>"뉴스 111", "text"=>"일부 텍스트"); if (!empty($data)) ( if (isset($Cache)) ( $ Cache->set($key_cache, $ data, array("post_update", "post_update_".$postID, "post_blog_".$data["blog_id"]), 3600*24*10); echo "캐시에 저장된 데이터 "; ) $data를 반환합니다. ) 그렇지 않으면 null을 반환합니다. ) ) $postID = 25; $post = get_post($postID); print_r($post); ?> ID=25인 게시물을 가져오고 싶습니다. 처음 호출하면 '캐시에 저장된 데이터'라는 메시지가 표시됩니다. 다시 전화하면 '캐시에서 가져온 데이터'라는 메시지가 표시됩니다. 이제 게시물을 업데이트해 보겠습니다(update_post.php 스크립트 실행).query("업데이트 게시물 설정 blog_id =?d, title=?, text=? WHERE id=?d", $blogID, $title, $text, $postID); // 이 게시물과 관련된 태그 지우기 $Cache = Cache::getInstance(); if (isset($Cache)) ( $Cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array("post_update", "post_update_".$postID, "post_blog_".$blogID)); ) return true; ) $포스트ID = 25; update_post($postID, 3, "테스트", "테스트 테스트"); ?>

그런 다음 get_post.php 스크립트를 실행하고 캐시에 데이터가 없는 것을 확인하고 거기에 다시 저장했습니다: "데이터를 캐시에 저장했습니다".

사실 캐싱에서 가장 어려운 점은 올바른 태그 배치. 따라서 게시물을 업데이트하면 이 게시물이 포함된 데이터도 업데이트됩니다.

위의 예에서는 태그였습니다.

  • "post_update_".$postID - 게시물 자체(일반적으로 게시물 출력 페이지)
  • "post_blog_".$blogID - 이 블로그의 게시물 목록이 표시되는 블로그 페이지
  • "post_update" - 메인 페이지 또는 최고의 게시물 목록과 관련된 태그

개 더미 효과

"개 무리"로 번역됩니다. 데이터베이스에서 2초 동안 복잡한 샘플이 있다고 가정해 보겠습니다. 아직 캐시에 없습니다(또는 캐시를 재설정합니다). 첫 번째 사용자가 도착하면 요청이 데이터베이스로 전송되고 2초 후에야 이 데이터가 캐시에 나타납니다. 따라서 이 2초 안에 10명의 추가 사용자가 사이트를 방문할 수 있으며, 이들은 데이터베이스에 대해 동일한 복잡한 요청을 10개 더 시작할 수 있습니다(아직 캐시에 데이터가 없고 첫 번째 요청이 여전히 실행 중이기 때문입니다). 이로 인해 서버를 로드하는 개 무리가 생성됩니다.

그것은 다음과 같습니다 :)

문제의 해결 방법이 설명되어 있습니다.
위의 코드는 dog-pile 효과에 대한 보호 기능을 제공하지 않습니다. 제 경우에는 이렇게 트래픽이 많고 요청이 오래 걸리는 경우가 없습니다.

이 문서에 제공된 정보를 적용하면 Memcached 서버와 Memcached 서버와 상호 작용하는 데 필요한 PHP 확장은 물론 분석 및 통계 서비스인 phpMemcachedAdmin을 설치하고 구성할 수 있습니다.

설치는 백엔드 서버가 있는 Debian에서 수행됩니다. 작동하는 번들 + php5-fpm이 있는 경우 명령에서 apache2를 php5-fpm으로 바꾸십시오.
작업 도구: 내장 편집기 또는 퍼티와 소프트웨어를 연결하기 위한 파일 관리자.

이제 이 호스팅에 이미 http://example.com 웹사이트가 있다고 가정해 보겠습니다.

먼저, PHP가 어떻게 구성되어 있는지 확인해야 합니다(Memcached가 이미 설치되어 있으면 어떻게 되나요?). 이를 위해 사이트 루트에 코드가 포함된 info.php 파일을 일시적으로 생성합니다.

이제 http://example.com/info.php를 살펴보겠습니다.

비슷한 항목이 있으면 모든 것이 정상이며 필요한 PHP 확장이 설치된 것입니다.
그렇지 않다면 일을 해야 합니다.

Memcached 서버 설치 방법

설치하기 전에 저장소를 업데이트해야 합니다.

Apt-get 업데이트 && apt-get 업그레이드

이제 memcached와 이에 대한 PHP 모듈을 설치해 보겠습니다.

Apt-get memcached 설치 php5-memcache

설치가 진행 중입니다. 완료 후 무슨 일이 있었는지 확인합니다.

결과적으로 우리는 다음과 같은 것을 보게 될 것입니다

Tcp 0 0 *:11211 *:* LISTEN 13053/memcached

이제 Apache 또는 php-fpm을 다시 시작해야 합니다.

서비스 apache2 다시 시작

Memcached 설정

이제 서버가 설치되었으므로 구성해야 합니다. 어렵지도 않고 시간도 많이 안 걸리고

외부 액세스에서 Memcached 닫기

보시다시피 memcached는 기본적으로 포트 11211에서 정지됩니다. memcached에는 인증 메커니즘이 내장되어 있지 않기 때문에 누구나 외부에서 연결하여 자신의 목적에 맞게 사용할 수 있는 것으로 나타났습니다. 이를 방지하려면 방화벽을 사용하여 포트 11211을 닫거나 memcached 서버를 구성하여 localhost에서만 사용할 수 있도록 하면 됩니다. 마지막 방법은 아래에 설명되어 있습니다.

  1. -l 127.0.0.1 줄을 추가하세요.
  2. memcached 재부팅

    서비스 memcached 다시 시작

    /etc/init.d/memcached 재시작

그리고 다시 확인해보자

Netstat-탭 | grep memcached

결국 우리는 이런 것을보아야합니다

Tcp 0 0 localhost.localdo:11211 *:* LISTEN 13092/memcached

또한 모든 변경 후에는 Apache를 다시 시작하는 것을 잊지 마십시오.

서비스 apache2 다시 시작

작업 메모리 양 늘리기 Memcached

기본적으로 Memcached는 64MB의 RAM을 사용하도록 할당됩니다. 1024로 늘리겠습니다. 서버 매개변수에서 진행하세요.

  1. vi 구성 파일 /etc/memcached.conf를 엽니다.
  2. 값 찾기 -m 64
  3. -m 1024로 변경하세요.
  4. memcached 서비스 다시 시작 memcached restart

Memcached에 PHP 세션 저장

여러 다른 사이트가 동일한 Memcached 서버 또는 클러스터를 사용하는 경우 서로의 세션을 가로채고 사용자 계정에 액세스할 수 있어 잠재적인 위험이 발생할 수 있습니다.

memcached를 사용하여 세션 저장소를 HDD에서 RAM으로 이동하면 PHP 속도를 높일 수 있습니다.

memcache 또는 memcached 중 어떤 PHP 확장을 사용하고 있는지 알아야 합니다. , phpinfo()를 사용하여 무엇을 가지고 있는지 확인할 수 있습니다. 설정에 미묘함이 있으므로 주의하세요.

Memcache 확장 방법

  1. /etc/php5/mods-available/memcache.ini를 엽니다.
  2. session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211" 추가

memcacheD 확장 방법

  1. /etc/php5/mods-available/memcached.ini를 엽니다.
  2. session.save_handler = memcached session.save_path = "127.0.0.1:11211" 추가
  3. 아파치 서비스 다시 시작 apache2 재시작

phpinfo 확인 중

이제 출력에서 ​​무엇을 얻었는지 확인해야 합니다. 이렇게 하려면 phpinfo()로 페이지를 열고 로컬 값이 있는 열의 코드에서 session.save_path를 찾으세요. 값은 tcp://127.0.0.1:11211 또는 127.0.0.1:11211 ..conf)이어야 하며 우리는 다음을 찾고 있습니다.
php_admin_value 세션.저장_경로

그런데 php_value 지시문을 사용하여 전체 서버를 전역적으로 구성하는 것이 아니라 특정 사이트만 구성할 수도 있습니다. 이렇게 하려면 사이트 루트에서 .htaccess를 편집하면 됩니다.

Php_value session.save_handler "memcache" php_value session.save_path "tcp://127.0.0.1:11211"

준비 작업 중인 Memcached 구성 파일

필요에 맞게 모든 것을 사용자 정의할 수도 있습니다. 구성 파일에는 자세한 설명이 포함되어 있습니다.

# memcached 기본 구성 파일 # 2003 - Jay Bonci< ># 이 구성 파일은 Debian GNU/Linux 배포판의 일부로 제공되는 # start-memcached 스크립트로 읽혀집니다. # memcached를 데몬으로 실행합니다. 이 명령은 암시적이며 # 데몬을 실행하는 데 필요하지 않습니다. # 자세한 내용은 이 패키지와 함께 제공되는 README.Debian을 참조하세요. -d # memcached"의 출력을 /var/log/memcached 로그 파일에 기록합니다. /var/log/memcached.log # 장황하게 작성합니다. # -v # 더욱 장황하게 작성합니다(클라이언트 명령도 인쇄합니다) # -vv # 대문자로 시작합니다. 64MB의 메모리입니다. 이는 "합리적이며 데몬 기본값입니다. # 데몬은 이 크기까지 커지지만 이 정도의 메모리를 보유하기 시작하지는 않습니다. # 메모리 # 캐싱에 할당되는 메모리 양(MB)입니다. 기본적으로 64MB입니다. #-m 64 -m 1024 # Memcached가 정지될 포트, 기본적으로 11211 -p 11211 # 루트로 데몬을 실행합니다. # 이 구성 파일에 -u 명령이 없으면 start-memcached는 기본적으로 루트로 실행됩니다. -u memcache # 수신 대기할 IP 주소를 지정합니다. 기본값은 모든 IP 주소를 수신하는 것입니다. # 이 매개변수는 memcached가 갖고 있는 유일한 보안 조치 중 하나이므로 # 방화벽이 있는 인터페이스에서 수신하는지 확인하십시오. -l 127.0.0.1 # 동시에 들어오는 연결 수를 제한합니다. 데몬 기본값은 1024입니다 # # -c 1024 # 페이징된 모든 메모리를 잠그기 전에 README 및 홈페이지를 참조하십시오. # -k # 메모리가 소진되면 오류를 반환합니다(항목을 제거하는 대신) # -M # 코어 파일 최대화 제한 # -r

Memcache 확장 프로그램 설치

다음은 콘솔에서 Memcache PHP 확장을 수동으로 설치할 수 있는 단계별 명령입니다.

Apt-get 설치 php5-dev libmemcache-dev pecl 다운로드 memcache tar xzvf memcache-2.2.6.tgz cd memcache-2.2.6/ phpize && ./configure --enable-memcache && cp 모듈/memcache.so /usr/ 만들기 lib/php5/20060613/ echo "extension=memcache.so" >> /etc/php5/apache2/php.ini

변경 사항을 적용하려면 Apache를 재부팅하십시오.

서비스 apache2 다시 시작

Memcached가 작동하는지 확인하는 방법

사이트 루트에 memcachetest.php 파일을 생성하고 거기에 다음 코드를 작성해 보겠습니다.

connect("localhost", 11211) 또는 exit("Memcached 서버에 연결할 수 없습니다."); $version = $memcache->getVersion(); echo "서버" 버전: ".$version."
\n"; $tmp_object = 새로운 stdClass; $tmp_object->str_attr = "test"; $tmp_object->int_attr = 123; $memcache->set("key", $tmp_object, false, 10) 또는 die("Not Memcached에 항목을 남겼습니다."); echo "Memcached 캐시에 데이터를 씁니다(데이터는 10초 동안 저장됩니다).
\n"; $get_result = $memcache->get("key"); echo "Memcached에 기록된 데이터:
\n"; var_dump($get_result); ?>

이제 결과를 확인하는 일만 남았습니다: http://example.com/memcachetest.php
모든 작업을 올바르게 수행했다면 다음과 같은 내용이 표시됩니다.

phpMemcachedAdmin - Memcached 모니터링, 통계 및 관리

phpMemcachedAdmin은 Linux에서 Memcached 서비스를 모니터링하고 관리하기 위한 웹 인터페이스를 제공하는 소프트웨어입니다. 가져오기, 설정, 삭제, 증가, 감소, 회수, 제거, CAS 등 서버에서 지원하는 모든 작업에 대한 실시간 통계와 서버 통계(네트워크, 위치, 작업 버전, 차트 및 내부)를 볼 수 있습니다. 서버 구성.

phpMemcachedAdmin 설치 및 구성

여기에서는 여러 가지 방법으로 이동할 수 있습니다. 이 서비스 운영을 위해 별도의 도메인 또는 하위 도메인을 할당합니다. 또는 작업 사이트에 하위 디렉토리를 만들고 여기에 비밀번호를 입력할 수도 있습니다. 폴더에 비밀번호를 설정하는 마지막 방법을 더 간단하게 설명하겠습니다.

이제 https://site라는 사이트가 있다고 가정해 보겠습니다.

CD /var/www/사이트

디렉토리를 생성하고 해당 디렉토리로 이동

Mkdir phpMemcachedAdmin && cd phpMemcachedAdmin

최신 버전의 배포판을 다운로드하세요.

Wget http://phpmemcacheadmin.googlecode.com/files/phpMemcachedAdmin-1.2.2-r262.tar.gz

배포 아카이브 압축 풀기 및 삭제

Tar -xvzf phpMemcachedAdmin-1.2.2-r262.tar.gz && rm -rf phpMemcachedAdmin-1.2.2-r262.tar.gz

현재 디렉터리에 필요한 액세스 권한을 반복적으로 설정합니다.

찾기 ./ -type f -exec chmod 0644 () \; 찾기 ./ -type d -exec chmod 0755 () \;

AuthType 기본 AuthName "개인 영역" AuthUserFile .htpasswd 사용자 memcachedmanager 필요

Create.htpasswd

Htpasswd -c .htpasswd memcachedmanager

비밀번호를 입력하세요.

그게 다야. memcachedmanager 디렉토리를 변경하지 않은 경우 해당 디렉토리에 로그인하십시오. https://site/phpMemcachedAdmin(도메인을 자신의 것으로 변경)을 열고 로그인/비밀번호를 입력하고 사용하십시오.

마지막으로

memcached에 대한 기사를 읽어 보시기 바랍니다. 여기에는 해당 작업에 대한 일반적인 정보와 작업의 일부 미묘함이 표시됩니다.
그게 다야. 불분명한 점이 있으면 댓글로 질문하세요.

이 게시물을 통해 저는 HighLoad++-2008의 보고서 자료를 기반으로 한 작은 일련의 게시물을 열고 싶습니다. 이후 전체 텍스트는 하나의 큰 PDF로 게시됩니다.

소개

먼저 일련의 게시물 제목에 대해 설명합니다. 게시물은 웹에서의 캐싱(부하가 높은 웹 프로젝트), 캐싱을 위한 memcached 사용, 웹 프로젝트에서의 기타 memcached 사용에 관한 것입니다. 즉, 이 일련의 게시물에서는 다양한 조합으로 된 이름의 세 가지 구성 요소를 모두 다룰 것입니다.

오늘날 캐싱은 모든 웹 프로젝트의 필수적인 부분이지만 반드시 부하가 높은 프로젝트는 아닙니다. 각 리소스에 대해 사용자에게 중요한 특성은 서버 응답 시간입니다. 서버 응답 시간이 증가하면 방문자가 유출됩니다. 따라서 응답 시간을 최소화하는 것이 필요합니다. 이를 위해서는 사용자에 대한 응답을 생성하는 데 필요한 시간을 줄여야 하며, 사용자에 대한 응답에는 일부 외부 리소스(백엔드)로부터 데이터를 수신해야 합니다. 이러한 리소스는 데이터베이스이거나 상대적으로 느린 기타 데이터 소스(예: 여유 공간을 확인하는 원격 파일 서버)일 수 있습니다. 상당히 복잡한 리소스의 한 페이지를 생성하려면 유사한 호출을 수십 번 수행해야 할 수도 있습니다. 그 중 대부분은 20ms 이하로 빠르지만 계산 시간을 초 또는 분 단위로 계산할 수 있는 소수의 쿼리가 항상 있습니다(가장 최적화된 시스템에서도 하나가 있을 수 있지만 그 수는 최소화되어야 함). . 쿼리 결과를 기다리는 데 소요되는 시간을 모두 합산하면(쿼리를 병렬로 실행하면 가장 긴 쿼리의 계산 시간이 소요됨) 만족스럽지 못한 응답 시간을 얻게 됩니다.

이 문제에 대한 해결책은 캐싱입니다. 계산 결과를 정보 액세스 시간 측면에서 탁월한 특성을 갖는 일부 저장소(예: memcached)에 저장합니다. 이제 느리고 복잡하며 무거운 백엔드를 호출하는 대신 빠른 캐시에 요청하기만 하면 됩니다.

Memcached 및 캐싱

지역성 원칙

우리는 CPU 캐시(1차 및 2차 수준), 하드 디스크 버퍼, 운영 체제 캐시, 자동차 라디오의 버퍼 등 전자 장치 및 소프트웨어 아키텍처의 모든 곳에서 캐시 또는 캐싱 접근 방식을 볼 수 있습니다. 캐싱의 성공 여부를 결정하는 것은 무엇입니까? 대답은 지역성 원칙에 있습니다. 즉, 프로그램이나 장치는 특정 기간 동안 일반 세트의 특정 데이터 하위 세트를 사용하여 작동하는 경향이 있습니다. RAM의 경우 이는 프로그램이 주소 100에 있는 데이터로 작동하는 경우 다음 액세스가 주소 10000이 아닌 주소 101, 102 등에서 이루어질 확률이 더 높다는 것을 의미합니다. 하드 드라이브도 마찬가지입니다: 버퍼는 마지막으로 읽은 섹터에 인접한 영역의 데이터로 채워집니다.우리 프로그램이 특정 시점에 상대적으로 작은 파일 세트가 아닌 하드 드라이브의 전체 내용으로 작동한 경우 , 버퍼는 의미가 없습니다. 자동차 스테레오 버퍼는 디스크에서 다음 몇 분 분량의 음악을 미리 읽습니다. 왜냐하면 우리는 일련의 음악을 건너뛰는 것보다 음악 파일을 순차적으로 듣는 경향이 더 높기 때문입니다.

웹 프로젝트의 경우 캐싱의 성공 여부는 사이트에 항상 가장 인기 있는 페이지가 있고 일부 데이터가 전체 또는 거의 모든 페이지에서 사용된다는 사실, 즉 훨씬 더 자주 요청되는 일부 선택 항목이 있다는 사실에 의해 결정됩니다. 다른 사람보다. 백엔드에 대한 여러 호출을 캐시를 구축하기 위한 한 번의 호출로 대체한 다음 모든 후속 호출은 빠르게 작동하는 캐시를 통해 이루어집니다.

캐시는 항상 원본 데이터 소스보다 낫습니다. CPU 캐시는 RAM보다 훨씬 빠르지만 RAM을 캐시만큼 빠르게 만들 수는 없습니다. 이는 비용이 비효율적이고 기술적으로 어렵습니다. 하드 디스크 버퍼는 하드 디스크 자체보다 훨씬 빠른 속도로 데이터 요청을 충족하지만 버퍼에는 전원이 꺼졌을 때 데이터를 기억하는 기능이 없습니다. 이러한 의미에서 장치 자체보다 나쁩니다. 상황은 웹 캐싱과 유사합니다. 캐시는 백엔드보다 빠르고 효율적이지만 일반적으로 서버가 다시 시작되거나 충돌하는 경우 데이터를 저장할 수 없으며 결과를 계산하는 논리도 없습니다. 이전에 입력한 내용만 반환할 수 있습니다.

멤캐시드

Memcached는 네트워크 프로토콜을 통해 액세스할 수 있는 거대한 인메모리 해시 테이블입니다. 키와 관련된 값을 저장하는 서비스를 제공합니다. 우리는 간단한 네트워크 프로토콜을 통해 해시에 접근합니다; 클라이언트는 임의의 프로그래밍 언어로 작성된 프로그램일 수 있습니다(C/C++, PHP, Perl, Java 등을 위한 클라이언트가 있습니다).

가장 간단한 작업은 지정된 키의 값을 가져오고(get), 키의 값을 설정하고(set), 키를 삭제하는(del) 것입니다. 원자적 작업 체인을 구현하려면(병렬 프로세스에 의해 memcached에 동시에 액세스해야 함) 키 값의 증가/감소(incr/decr), 키 값의 시작 또는 끝에 데이터 추가(추가)와 같은 추가 작업이 사용됩니다. /prepend), 원자 연결 값 가져오기/설정(gets/cas) 등.

Memcached는 Brad Fitzpatrick이 LiveJournal 프로젝트 작업의 일부로 구현했습니다. 페이지 콘텐츠를 제공할 때 데이터베이스 요청을 완화하는 데 사용되었습니다. 오늘날 memcached는 Wikipedia, YouTube, Facebook 등 많은 대규모 프로젝트의 핵심에서 사용됩니다.

일반적으로 캐싱 방식은 다음과 같습니다. 프런트엔드(사용자에 대한 응답을 생성하는 프로젝트의 일부)는 일부 샘플에서 데이터를 받아야 합니다. 프런트엔드는 캐시 가져오기(요청 가져오기)를 위해 cheetah-fast memcached 서버에 접속합니다. 해당 키를 찾으면 거기서 작업이 종료됩니다. 그렇지 않으면 대부분 데이터베이스인 무겁고 서투르지만 강력한(코끼리처럼) 백엔드로 전환해야 합니다. 결과 결과는 캐시(설정 요청)로 즉시 memcached에 기록됩니다. 이 경우 키에는 일반적으로 캐시가 재설정되는 순간에 해당하는 최대 수명(만료 날짜)이 제공됩니다.

이 표준 캐싱 체계는 항상 구현됩니다. 일부 프로젝트에서는 memcached 대신 로컬 파일이나 다른 저장 방법(다른 데이터베이스, PHP 가속기 캐시 등)을 사용할 수 있지만, 아래에서 볼 수 있듯이 부하가 높은 프로젝트에서는 이 방식이 가장 효율적으로 작동하지 않을 수 있습니다. . 그럼에도 불구하고, 앞으로의 이야기에서 우리는 이 계획에 의존할 것입니다.

memcached 아키텍처

memcached는 어떻게 작동하나요? 사이트의 한 페이지를 처리하는 데 필요한 수십 개의 memcached 요청조차도 상당한 지연으로 이어지지 않도록 어떻게 그렇게 빠르게 작업할 수 있습니까? 동시에 memcached는 컴퓨팅 리소스 측면에서 매우 까다롭습니다. 로드된 설치에서 사용되는 프로세서 시간은 거의 10%를 초과하지 않습니다.

첫째, memcached는 모든 작업의 ​​알고리즘 복잡도가 O(1)이 되도록 설계되었습니다. 모든 작업의 ​​실행 시간은 memcached가 저장하는 키 수에 의존하지 않습니다. 이는 구현에 선형(O(n)) 시간만 필요한 경우 일부 작업(또는 기능)이 누락된다는 의미입니다. 따라서 memcached에는 키를 "폴더로" 결합하는 기능이 없습니다. 키 그룹화 및 키 또는 해당 값에 대한 그룹 작업을 찾을 수 없습니다.

주요 최적화 작업은 키 저장을 위한 메모리 블록 할당/해제, 메모리가 부족할 때 캐시를 지우는 LRU(최소 사용 키) 정책 정의입니다. 키 검색은 해싱을 통해 발생하므로 O(1)의 복잡성을 갖습니다.

비동기 I/O를 사용하고 스레드를 사용하지 않으므로 성능이 추가로 향상되고 리소스 요구 사항이 낮아집니다. 실제로 memcached는 스레드를 사용할 수 있지만 이는 로드가 너무 많은 경우 서버에서 사용 가능한 모든 코어 또는 프로세서를 사용하는 데만 필요합니다. 어떤 경우에도 각 연결에 대해 스레드가 생성되지 않습니다.

실제로 Memcached 서버의 응답 시간은 네트워크 비용에 의해서만 결정되며 프런트엔드에서 Memcached 서버(RTT)로 패킷을 전송하는 데 걸리는 시간과 거의 같다고 할 수 있습니다. 이러한 특성으로 인해 로드가 많은 웹 프로젝트에서 memcached를 사용하여 데이터 캐싱을 포함한 다양한 문제를 해결할 수 있습니다.

열쇠 분실

Memcached는 신뢰할 수 있는 저장소가 아닙니다. 키의 수명이 만료되기 전에 캐시에서 키가 제거될 수 있습니다. 프로젝트 아키텍처는 이러한 상황에 대비해야 하며 키 손실에 유연하게 대응해야 합니다. 키를 분실하는 데에는 세 가지 주요 이유가 있습니다.
  1. 다른 키의 값을 저장할 메모리가 부족하여 만료일 전에 키가 삭제되었습니다. Memcached는 LRU 정책을 사용하므로 이러한 손실은 키가 거의 사용되지 않았으며 캐시 메모리가 더 많이 사용되는 키를 저장하기 위해 확보되었음을 의미합니다.
  2. 키의 수명이 만료되어 키가 삭제되었습니다. 엄밀히 말하면 이 상황은 손실이 아닙니다. 왜냐하면 우리는 키의 수명을 제한했기 때문입니다. 그러나 memcached와 관련된 클라이언트 코드의 경우 이러한 손실은 다른 경우와 구별할 수 없습니다. memcached에 액세스할 때 우리는 "거기"라는 응답을 받습니다. 그런 열쇠는 없어.”
  3. 가장 불쾌한 상황은 memcached 프로세스나 해당 프로세스가 위치한 서버의 충돌입니다. 이 상황에서는 캐시에 저장된 모든 키가 손실됩니다. 클러스터 구성을 사용하면 결과를 어느 정도 완화할 수 있습니다. 프로젝트 키가 "확산"되는 많은 Memcached 서버: 이렇게 하면 하나의 캐시 붕괴로 인한 결과가 눈에 덜 띄게 됩니다.

memcached와 함께 작동하는 소프트웨어를 개발할 때는 설명된 모든 상황을 염두에 두어야 합니다. memcached에 저장한 데이터를 손실 심각도에 따라 나눌 수 있습니다.

"잃어버릴 수도 있어". 이 범주에는 데이터베이스 선택 캐시가 포함됩니다. 백엔드에 다시 액세스하면 해당 값을 쉽게 복원할 수 있으므로 이러한 키를 잃어버리는 것은 그리 나쁘지 않습니다. 그러나 캐시 손실이 자주 발생하면 불필요한 데이터베이스 호출이 발생합니다.

“지고 싶지 않아요”. 여기에서는 사이트 방문자 카운터, 리소스 보기 등을 언급할 수 있습니다. 이러한 값을 직접 복원하는 것이 불가능한 경우도 있지만 이러한 키의 값은 시간 제한적 의미를 갖습니다. 몇 분 후에 해당 값은 더 이상 관련이 없으며 새 값이 계산됩니다.

“우리는 전혀 져서는 안 된다”. Memcached는 사용자 세션을 저장하는 데 편리합니다. 모든 세션은 프런트엔드 클러스터에 포함된 모든 서버에서 동일하게 액세스할 수 있습니다. 따라서 나는 세션 내용을 절대 잃어버리고 싶지 않습니다. 그렇지 않으면 사이트의 사용자가 "로그아웃"됩니다. 피하려고 노력하는 방법은 무엇입니까? 클러스터의 여러 memcached 서버에 세션 키를 복제할 수 있으므로 손실 가능성이 줄어듭니다.

공유하다