>  기사  >  백엔드 개발  >  PHP에서 memcached에 세션을 저장하는 방법은 무엇입니까? PHP 세션을 분산 저장하는 방법

PHP에서 memcached에 세션을 저장하는 방법은 무엇입니까? PHP 세션을 분산 저장하는 방법

伊谢尔伦
伊谢尔伦원래의
2016-11-26 14:52:491101검색

session_set_save_handler는 memcached의 세션 저장 방법과 아무 관련이 없습니다

memcached 서버에서

1) memcached를 다운로드합니다

#wget http://memcached.googlecode. com/files /memcached-1.4.15.tar.gz

2) memcached는 libevent에 의존하기 때문에 먼저 libevent 라이브러리를 설치해야 합니다. 여기서는 yum을 직접 설치합니다

#yum install *libevent*

3)memcached 설치

#./configure --prefix=/usr/local/memcached
#make
#make install

4) memcached 시작

#/usr/local/memcached/bin/memcached -d -m 4096 -p 11211 -u root
-d daemon ?-p port -u ?user -m memory

웹 서버에 서버에

5) 웹 서버에 php memcache 모듈 설치

#/usr/local/php/bin/pecl install memcache

Memcache 세션 핸들러 지원을 활성화하시겠습니까? [예] : 예(여기서 예를 선택하세요.)

6) php.ini에 다음 콘텐츠를 추가하세요.

extension=/usr/local/php /lib/php/extensions/no- debug-non-zts-20090626/memcache.so

7) php.ini의 session.save_handler 및 session.save_path를 다음 내용으로 수정합니다.

session.save_handler = memcache
session.save_path = "tcp://memcached 서버 ip:11211"

PHP 프로그램에서도

ini_set('session.save_handler', 'memcache ');
ini_set ('session.save_path', 'tcp://memcached server ip:11211');

참고: 세션을 저장하기 위해 memcached를 사용하는 이 방법은 session_set_save_handler와 아무 관련이 없습니다.

memcached 후 설치 완료

php.ini

session.save_handler를 memcache로 변경하고 save_path를 memcache의 주소와 포트를 가리키도록 수정합니다. memcached

session.save_handler = memcache
session.save_path = tcp://127.0.0.1:11211

Memcache의 PECL 확장은 매우 강력하며 장애 조치 및 분산 스토리지를 지원할 수 있습니다.

사용법은 매우 간단합니다. 다음과 같이 session.save_path 매개변수 목록에서 각 memcached 서버를 쉼표로 구분하면 됩니다.

session.save_path = "tcp://172.16.8.81 : 11211,tcp://172.16.8.82:11211,tcp://172.16.8.83:11211"

저장된 세션은 해시된 후 각 memcached 서버에 저장되며 해시 알고리즘 memcache는 두 가지를 지원합니다. 종, crc32 및 fnv:

memcache.hash_function= {crc32,fnv}

fnv 알고리즘은 문서에서 거의 언급되지 않습니다. crc32보다 해싱이 더 좋다고 합니다. 다음과 같은 소규모 프로그램 실험 후에 crc32 해시 알고리즘이 여전히 더 균등하게 분산되어 있는 것으로 나타났습니다.

<?php
ini_set("memcache.hash_function", "crc32");
$memcache = new Memcache;
$memcache1 = new Memcache;
$memcache2 = new Memcache;
$memcache->addServer(&#39;localhost&#39;, 11211);
$memcache->addServer(&#39;localhost&#39;, 11212);
$memcache->flush();
$memcache1->connect(&#39;localhost&#39;, 11211);
$memcache2->connect(&#39;localhost&#39;, 11212);
$fp1 = fopen("mem1.txt", "w");
$fp2 = fopen("mem2.txt", "w");
for ($i = 0; $i < 1000; $i++)
{
$memcache->set($i, $i, 0, 1000);
fwrite($fp1, $memcache1->get($i) . " ");
fwrite($fp2, $memcache2->get($i) . " ");
}
fclose($fp1);
fclose($fp2);

그런 다음 세션 저장을 테스트했습니다

테스트를 위해 memcached 프로세스를 3개 열었습니다

<?php
ini_set("memcache.hash_function", "fnv");
ini_set("error_reporting", "E_CORE_ERROR");
$memcache1 = new Memcache;
$memcache1->connect(&#39;localhost&#39;, 11211);
$memcache1->flush();
$memcache2 = new Memcache;
$memcache2->connect(&#39;localhost&#39;, 11212);
$memcache2->flush();
$memcache3 = new Memcache;
$memcache3->connect(&#39;localhost&#39;, 11213);
$memcache3->flush();
$fp1 = fopen(&#39;mem1.txt&#39;, &#39;w&#39;);
$fp2 = fopen(&#39;mem2.txt&#39;, &#39;w&#39;);
$fp3 = fopen(&#39;mem3.txt&#39;, &#39;w&#39;);
for ($i = 0; $i < 1000; $i++)
{
session_start();
$ssid = session_id();
echo $ssid;
session_register("id");
$_SESSION["id"] = $ssid;
session_write_close();
fwrite($fp1, $memcache1->get($ssid) . &#39; &#39;);
fwrite($fp2, $memcache2->get($ssid) . &#39; &#39;);
fwrite($fp3, $memcache3->get($ssid) . &#39; &#39;);
//session_destroy();
}
fclose($fp1);
fclose($fp2);
fclose($fp3);

이상한 것은 memcached2가 일반적으로 선택되지 않는다는 것입니다. ,

과 1, 3의 내용은 일치합니다. 장애 조치용일 수도 있습니다.

1과 3을 끄면 2에 콘텐츠가 나타나 memcached2가 정상적으로 작동하고 있음을 나타냅니다.

이 현상은 내 해싱 알고리즘이 crc32를 사용하든 fnv를 사용하든 관계없이 존재합니다.

마침내 발견한 것은 이 테스트 프로그램에 문제가 있다는 것입니다.

session_write_close 이후에는 전체 프로그램의 세션이 고유하기 때문입니다.

즉, session_destroy 호출을 포함하여 루프가 여러 번 반복되었지만 반환된 세션 ID는 동일합니다.

이로 인해 두 파일의 내용은 일치하지만 다른 파일에는 내용이 없습니다.

이를 바탕으로

스크립트를 일괄적으로 호출할 수만 있습니다. 다음과 같이 수정하세요.

<?php
ini_set("memcache.hash_strategy", "consistent");
ini_set("memcache.hash_function", "crc32");
ini_set("error_reporting", "E_CORE_ERROR");
ini_set("memcache.allow_failover", "0");
$memcache1 = new Memcache;
$memcache1->connect(&#39;localhost&#39;, 10001);
$memcache1->flush();
$memcache2 = new Memcache;
$memcache2->connect(&#39;localhost&#39;, 10002);
$memcache2->flush();
$memcache3 = new Memcache;
$memcache3->connect(&#39;localhost&#39;, 10003);
$memcache3->flush();
$fp1 = fopen("mem1.txt", "a+");
$fp2 = fopen("mem2.txt", "a+");
$fp3 = fopen("mem3.txt", "a+");
session_start();
$ssid = session_id();
echo $ssid . "\n";
session_register("id");
$_SESSION["id"] = $ssid;
//session_destroy();
session_write_close();
fwrite($fp1, $memcache1->get($ssid) . " ");
fwrite($fp2, $memcache2->get($ssid) . " ");
fwrite($fp3, $memcache3->get($ssid) . " ");
session_destroy();
fclose($fp1);
fclose($fp2);
fclose($fp3);

그런 다음 셸에서 여러 번 실행하면 반환된 ID가 다릅니다.

mem*.txt 파일을 열어서 확인해 보세요.

3개의 파일 중 각 세션이 2개의 파일에 저장되어 배포 방식이 다른 것으로 확인됩니다.

이것은 Memcache가 세션을 저장하는 데 사용된다는 것을 증명합니다. 하나는 장애 조치를 달성하는 것이고, 두 번째는 해시 분산을 수행하고 세션 ID에 따라 저장하는 것입니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.