色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

PHP如何將session保存到memcached中?如何分布式保存PHP session

瀏覽:2日期:2022-09-13 11:40:40
session_set_save_handler無關(guān)的memcached保存session的方法

在memcached服務(wù)器上

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

在web server服務(wù)器上

5)在web server上安裝php的memcache模塊

#/usr/local/php/bin/pecl install memcacheEnable memcache session handler support? [yes] : yes(這里選擇yes)

6)在php.ini中加入如下內(nèi)容:

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

7)修改php.ini中的session.save_handler及session.save_path為如下內(nèi)容:

session.save_handler = memcachesession.save_path = 'tcp://memcached服務(wù)器ip:11211'

亦可在PHP程序中

ini_set(’session.save_handler’, ’memcache’);ini_set(’session.save_path’, ’tcp://memcached服務(wù)器ip:11211’);

注意:這種使用memcached保存session的方式與session_set_save_handler無關(guān)

安裝完memcached之后

在php.ini中

將session.save_handler 修改為memcache,并修改save_path指向memcached的地址和端口即可

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

memcache的PECL這個擴(kuò)展非常強(qiáng)大,可以支持failover以及分布存儲。

使用方法很簡單,只需要在session.save_path的參數(shù)列表中,使用逗號分隔各個memcached服務(wù)器,如:

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

則保存的session會經(jīng)過hash之后保存到各個memcached服務(wù)器中,而hash的算法memcache支持兩種,crc32以及fnv:

memcache.hash_function= {crc32,fnv}

文檔中很少有提到fnv算法的,據(jù)說其散列要比crc32更好,但是我通過以下小小的程序?qū)嶒炛螅l(fā)現(xiàn)仍舊是crc32的散列算法分布的更加平均。

<?phpini_set('memcache.hash_function', 'crc32');$memcache = new Memcache;$memcache1 = new Memcache;$memcache2 = new Memcache;$memcache->addServer(’localhost’, 11211);$memcache->addServer(’localhost’, 11212);$memcache->flush();$memcache1->connect(’localhost’, 11211);$memcache2->connect(’localhost’, 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);

接著我就session的保存進(jìn)行了測試

我開了3個memcached進(jìn)程進(jìn)行測試

<?phpini_set('memcache.hash_function', 'fnv');ini_set('error_reporting', 'E_CORE_ERROR');$memcache1 = new Memcache;$memcache1->connect(’localhost’, 11211);$memcache1->flush();$memcache2 = new Memcache;$memcache2->connect(’localhost’, 11212);$memcache2->flush();$memcache3 = new Memcache;$memcache3->connect(’localhost’, 11213);$memcache3->flush();$fp1 = fopen(’mem1.txt’, ’w’);$fp2 = fopen(’mem2.txt’, ’w’);$fp3 = fopen(’mem3.txt’, ’w’);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) . ’ ’);fwrite($fp2, $memcache2->get($ssid) . ’ ’);fwrite($fp3, $memcache3->get($ssid) . ’ ’);//session_destroy();}fclose($fp1);fclose($fp2);fclose($fp3);

比較奇怪的是 memcached2一般都會不被選中,

而1,3的內(nèi)容是一致的。可能是為了failover,

而當(dāng)我把1,3關(guān)閉后,2中將會出現(xiàn)內(nèi)容,說明memcached2是正常工作的。

而不論我的散列算法使用crc32還是fnv,這種現(xiàn)象都存在,

最后我發(fā)現(xiàn):這個測試程序存在問題。

因為在session_write_close之后,整個程序的session都是唯一的了。

也就是雖然循環(huán)了這么多次,里面包含了session_destroy調(diào)用,但是返回的session id都是同樣的。

這就導(dǎo)致了兩個文件中的內(nèi)容一致而另一個文件中沒有內(nèi)容,

基于此點,

我只能分次調(diào)用腳本,腳本修改如下:

<?phpini_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(’localhost’, 10001);$memcache1->flush();$memcache2 = new Memcache;$memcache2->connect(’localhost’, 10002);$memcache2->flush();$memcache3 = new Memcache;$memcache3->connect(’localhost’, 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);

然后再shell中重復(fù)運行多次,返回的ID不同了。

再打開mem*.txt文件查看,

發(fā)現(xiàn)3個文件中,每個session會保存在其中兩個文件,然后分布不同。

這證明了使用memcache來保存session,一個是做到了failover,第二會按照session id來做hash分布保存。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 久久久免费精品视频 | 91久久精品视频 | 99精品免费观看 | 手机在线观看精品国产片 | 亚洲成人免费在线 | 久久精品国产99久久99久久久 | 草草影院www色极品欧美 | 99久久成人国产精品免费 | 国产一区二区三区高清 | 日韩高清一级毛片 | 国产成人女人视频在线观看 | 中国人免费观看高清在线观看二区 | 中文乱码一二三四有限公司 | 日韩美女专区中文字幕 | 免费一级 一片一毛片 | 欧美手机在线 | 99re这里只有精品99 | 国产黄色自拍视频 | 怡红院在线观看在线视频 | 国产亚洲人成a在线v网站 | 亚洲精品在线视频观看 | 亚洲人妖女同在线播放 | 欧美一级纶理片免费 | 国产成人一区二区 | 男人的天堂精品国产一区 | 在线播放日韩 | 欧美三级做爰全过程 | 网站免费满18成年在线观看 | 国产三级全黄 | 精品视频免费在线观看 | 太平公主三级dvd | 97超频国产在线公开免费视频 | 亚洲日本激情 | 欧美成免费 | 精品真实国产乱文在线 | 色欧美与xxxxx| 美女黄页网站 | 国产伦精品一区二区三区网站 | 精品国产爱久久 | 久久免费在线视频 | 欧美亚洲国产精品久久久久 |