> 백엔드 개발 > PHP 튜토리얼 > PHP 메모리 캐시 memcached 모듈 설치 및 사용

PHP 메모리 캐시 memcached 모듈 설치 및 사용

WBOY
풀어 주다: 2016-07-25 08:52:43
원래의
846명이 탐색했습니다.
  1. # tar -xzf libevent-1.1a.tar.gz
  2. # cd libevent-1.1a
  3. # ./configure --prefix=/usr
  4. # make
  5. # make install
  6. # cd ..
  7. # tar -xzf memcached-1.1.12.tar.gz
  8. # cd memcached-1.1.12
  9. # ./configure --prefix=/usr
  10. # make
  11. # make install
复主代码

설치가 완료된 후 memcached는 /usr/bin/memcached에 있어야 합니다. 3. memcached 데몬을 실행합니다. memcached 데몬을 실행하는 것은 매우 간단합니다. 구성 파일을 수정할 필요가 없습니다(수정할 구성 파일이 없음): /usr/bin/memcached - d -m 128 -l 192.168.1.1 -p 11211 -u httpd 매개변수 설명: -d는 데몬 모드에서 memcached를 실행합니다. -m은 memcached가 사용할 수 있는 메모리 크기를 M 단위로 설정합니다. -l은 모니터링 IP 주소를 설정합니다. 로컬 시스템인 경우 일반적으로 이 매개변수를 설정할 필요가 없습니다. -p는 청취 포트를 설정하고 기본값은 11211이므로 이 매개변수를 설정할 필요가 없습니다. -u는 사용자를 지정합니다. 현재 루트인 경우 이 매개변수를 사용하여 사용자를 지정해야 합니다. 물론, 사용할 수 있는 다른 매개변수도 있습니다. man memcached를 실행하면 해당 매개변수를 볼 수 있습니다.

3. memcached의 작동 원리: 첫째, memcached는 하나 이상의 서버에서 데몬으로 실행되며 언제든지 클라이언트 연결 작업을 허용합니다. 현재 알려진 클라이언트 API에는 Perl/PHP/Python이 포함됩니다. /루비/자바/C#/C 등 PHP와 같은 클라이언트가 memcached 서비스와 연결을 설정한 후 다음으로 해야 할 일은 개체에 액세스하는 것입니다. 액세스된 각 개체에는 고유한 식별자 키가 있습니다. 액세스 작업은 이 키를 통해 수행되고 memcached에 있는 개체는 실제로 메모리에 저장됩니다. , 캐시 파일에 저장되지 않으므로 memcached가 매우 효율적이고 빠를 수 있습니다.

이러한 개체는 영구적이지 않으며 서비스가 중지되면 내부 데이터가 손실된다는 점에 유의하세요.

4. PHP를 Memcached 클라이언트로 사용하는 방법에는 두 가지가 있습니다.

PHP를 memcached 클라이언트로 사용하여 객체 액세스 작업을 위한 memcached 서비스를 호출할 수 있습니다.

먼저 PHP에는 memcache라는 확장이 있습니다. Linux에서 컴파일할 때 Windows에서는 php.ini에서 php_memcache.dll 앞에 있는 주석을 제거해야 합니다. 그게 가능하다고요. 그 외에도 확장 및 재컴파일로 인한 문제를 피하는 또 다른 방법이 있는데, 바로 php-memcached-client를 직접 사용하는 것입니다.

이 기사에서는 두 번째 방법을 사용합니다. 확장 라이브러리에 비해 효율성은 약간 떨어지지만 큰 문제는 아닙니다. 4. PHP memcached 애플리케이션 예시 먼저 memcached-client.php를 다운로드한다. memcached-client.php를 다운로드한 후, 이 파일에 있는 "memcached" 클래스를 통해 memcached 서비스를 운용할 수 있다. 실제로 사용되는 코드 호출은 매우 간단합니다. add(), get(), replacement() 및 delete() 메소드 설명은 다음과 같습니다. add ($key, $val, $exp = 0 ) memcached에 객체 쓰기 $key는 객체의 고유 식별자입니다. $val은 만료 시간(초)입니다. 객체의 고유 식별자 $key를 통해 memcached에서 객체 데이터를 얻습니다. 교체($key, $value, $exp=0) $value를 사용하여 memcached의 식별자 $key로 바꾸십시오. 매개변수는 $key 객체가 존재하는 경우에만 작동합니다($key, $time = 0). memcached에서 $key 식별자를 가진 객체를 삭제합니다. $time은 삭제 전 대기 시간을 나타내는 선택적 매개변수입니다.

다음은 식별자 'mykey'를 사용하여 객체 데이터에 액세스하는 간단한 테스트 코드입니다.

  1. // memcached 클래스 파일 포함
  2. require_once('memcached-client.php')
  3. // 옵션 설정
  4. $options = array(
  5. 'servers' => array('192.168.1.1:11211'), //memcached 서비스의 주소 및 포트. 여러 배열 요소를 사용하여 여러 memcached 서비스를 나타낼 수 있습니다
  6. 'debug' => ; true, //디버그 활성화 여부
  7. 'compress_threshold' => 10240, //데이터가 바이트 수 초과 시 압축
  8. 'persistant' => false //영구 연결 사용 여부
  9. ) ;
  10. // memcached 객체 인스턴스 생성
  11. $mc = new memcached($options);
  12. // 이 스크립트에서 사용하는 고유 식별자 설정
  13. $key = 'mykey'; 🎜>/ / memcached에 객체 쓰기
  14. $mc->add($key, 'some Random strings')
  15. $val = $mc->get($key)
  16. echo " n ".str_pad('$mc->add() ', 60, '_')."n";
  17. var_dump($val);
  18. // 작성된 객체 데이터 값 교체
  19. $mc->replace($key, array('some'=>'haha', 'array'=>'xxx'))
  20. $val = $mc->get($key ) ;
  21. echo "n".str_pad('$mc->replace() ', 60, '_')."n"
  22. var_dump($val)>// memcached 개체 삭제
  23. $mc->delete($key);
  24. $val = $mc->get($key)
  25. echo "n".str_pad('$mc-> delete( ) ', 60, '_')."n";
  26. var_dump($val);
  27. ?>
코드 복사

실제 응용에서는 데이터베이스 쿼리의 결과 집합을 대개 memcached에 저장하고, 다음에 접근할 때 데이터베이스 쿼리 작업을 수행하는 대신 memcached에서 직접 가져오므로 데이터베이스에 대한 부담을 줄일 수 있습니다. 상당히. 일반적으로 SQL 문 md5() 뒤의 값이 고유 식별자 키로 사용됩니다.

다음은 데이터베이스 쿼리 결과 집합을 캐시하기 위해 memcached를 사용하는 예입니다(이 코드 조각은 위의 샘플 코드 바로 뒤에 나옵니다).

  1. $sql = 'SELECT * FROM users';
  2. $key = md5($sql); //memcached 객체 식별자
  3. {
  4. // memcached에서 캐시된 데이터를 얻지 못한 경우 데이터베이스 쿼리를 사용하여 레코드 세트를 얻습니다.
  5. echo "n".str_pad('MySQL에서 데이터를 읽습니다.', 60, '_')."n"
  6. $conn = mysql_connect('localhost', 'test', 'test');
  7. mysql_select_db('test');
  8. $result = mysql_query($sql);
  9. while ($row = mysql_fetch_object($result))
  10. $datas[] = $row; //다음 접속 시 사용할 수 있도록 데이터베이스에서 얻은 결과 세트 데이터를 memcached에 저장합니다.
  11. $mc->add($key, $datas);
  12. {
  13. echo "n".str_pad('memcached에서 데이터를 읽습니다.', 60, '_')."n";
  14. }
  15. var_dump($datas);
  16. ?>
코드 복사
memcached를 사용한 후 데이터베이스가 연결 및 쿼리 작업의 경우 데이터베이스 부하가 줄어들고 스크립트 실행 속도도 향상됩니다. 이전에 "PHP는 SESSION 데이터의 다중 서버 공유를 구현합니다"라는 기사를 작성한 적이 있습니다. 기사의 SESSION은 동시 액세스 수가 많으면 서버에 대한 부하가 매우 커지게 됩니다. MySQL의 최대 연결은 종종 초과됩니다. memcached를 사용하면 이 문제를 잘 해결할 수 있습니다. 작동 원리는 다음과 같습니다. 사용자가 웹 페이지에 접속하면 memcached에 현재 사용자의 SESSION 데이터가 있는지 확인하고, 해당 데이터가 있으면 session_id()를 고유 식별자로 사용하고, 없으면 바로 반환한다. 다시 데이터베이스로 이동하여 SESSION 데이터를 얻고 다음 사용을 위해 이 데이터를 memcached에 저장합니다. 현재 PHP 작업이 종료되면(또는 session_write_close()가 사용됨) My_Sess::write() 메서드가 호출되어 데이터베이스에 데이터를 씁니다. 이 경우에도 이 메서드는 계속해서 데이터베이스 작업을 수행합니다. 최적화가 필요합니다. 전역 변수를 사용하여 사용자가 페이지에 진입할 때 SESSION 데이터를 기록한 후 write() 메소드에서 이 데이터를 비교하여 작성하려는 SESSION 데이터와 동일한지 확인하고 다른 경우 연결합니다. 데이터베이스에 기록하는 동시에 해당 데이터를 memcached에 추가합니다. 객체가 동일하면 SESSION 데이터가 변경되지 않았음을 의미하므로 별도의 조치 없이 바로 반환할 수 있습니다.

그렇다면 사용자 SESSION 만료 시간을 해결하는 방법은 무엇일까요? memcached의 add() 메소드에는 만료 시간 매개변수 $exp가 있다는 것을 기억하십니까? 이 매개변수 값을 SESSION의 최대 생존 시간보다 작게 설정하면 됩니다. 또한, 항상 온라인 상태인 사용자를 위해 SESSION 기간을 연장하는 것을 잊지 마세요. 이는 write() 메소드로 해결될 수 있으며, 시간을 판단하여 조건이 충족되면 데이터베이스 데이터가 업데이트됩니다.

php memcached 클라이언트 memcached

Memcache를 설치할 때 memcached 클라이언트가 memcache라고 언급한 적이 있습니다. 실제로 memcached라는 libmemcached 기반 클라이언트가 더 좋고 더 많은 기능을 가지고 있다고 합니다.

memcache 공식 홈페이지: http://pecl.php.net/package/memcache Memcached 공식 홈페이지: http://pecl.php.net/package/memcached

다음은 Memcached 버전의 PHP 모듈을 설치하는 과정 기록입니다.

  1. $mem = new Memcache;

  2. $mem->addServer($memcachehost, '11211')
  3. $mem->addServer($memcachehost, '11212')
  4. $mem->set('hx','9enjoy')
  5. echo $mem->get('hx' );

  6. $md = new Memcached;

  7. $servers = array(
  8. array($memcachehost, '11211'),
  9. array($memcachehost, ' 11212')
  10. )
  11. $md->addServers($servers)
  12. $md->set('hx','9enjoy')
  13. echo $md-> get('hx');

코드 복사

Memcached에는 getMulti, getByKey, addServers 등 Memcache보다 더 많은 메서드가 있습니다. Memcached에는 Memcache의 연결 방법이 없으며 현재 긴 연결을 지원하지 않습니다. Memcached는 바이너리 프로토콜을 지원하지만 Memcache는 지원하지 않습니다. 즉, Memcached의 성능이 더 높아집니다. Memcache는 기본적으로 구현되며 OO 인터페이스와 비 OO 인터페이스의 공존을 지원합니다. Memcached는 libmemcached를 사용하고 OO 인터페이스만 지원합니다. 자세한 차이점: http://code.google.com/p/memcached/wiki/PHPClientComparison

Memcached 서버는 중앙 집중식 캐싱 시스템으로, 분산 구현 방식은 클라이언트에 의해 결정됩니다. memcached의 배포 알고리즘에는 일반적으로 두 가지 옵션이 있습니다. 1. hash(key) 결과에 따라 나머지 모듈 연결 개수에 따라 어떤 노드를 저장할지 결정합니다. 즉, hash(key)% session.size() 이 알고리즘은 간단하고 빠르며 성능이 좋습니다. 하지만 이 알고리즘에는 단점이 있습니다. 즉, memcached 노드를 추가하거나 삭제하면 원래 캐시된 데이터가 대규모로 무효화되고, 노드와 캐시된 데이터가 많을 경우 적중률에 큰 영향을 미치게 됩니다. 캐시를 재구축하는 데 드는 비용이 너무 높으므로 두 번째 알고리즘을 사용합니다. 2. 일관된 해싱, 일관된 해싱 알고리즘, 노드 검색 프로세스는 다음과 같습니다.

먼저 memcached 서버(노드)의 해시값을 찾아 0부터 232까지 원(연속체)에 구성합니다. 그런 다음 동일한 방법을 사용하여 데이터가 저장되어 있는 키의 해시 값을 찾아 원에 매핑합니다. 그런 다음 데이터가 매핑된 위치부터 시계방향으로 검색하여 가장 먼저 발견된 서버에 데이터를 저장합니다. 2의 32제곱을 초과한 후에도 여전히 서버를 찾을 수 없으면 첫 번째 memcached 서버에 저장됩니다.

Memcache는 구성 없이 첫 번째 방법을 사용합니다. 첫 번째 방법을 구현하기 위해 memcached는 다음을 사용하는 것 같습니다(확인되지 ​​않음). $md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

두 번째 일관된 해싱 알고리즘: Memcache가 php.ini에 추가되었습니다.

Memcache.hash_strategy =일관적 Memcache.hash_function =crc32

Memcached가 프로그램에 추가되었습니다(확정되지 않음).

$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); $md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC); 또는 $mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT); $mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿