Ⅰ 基於memcached的session會話共享怎樣實現
由於Cookie是保存的用戶客戶端的,安全性存在問題,為保證用戶數據的安全性,我們必須使用Session機制來保存用戶登錄後的一些信息。
如果我們使用LVS對Apache實現負載均衡,就無法保證用戶每次都能被分配到同一台Apache Server上,以取到自己的Session,雖然LVS可以加-p參數來保證客戶端每次都被分配到同一台Apache Server上,但這種方式存在一些弊端,比如必須設置一個保持時間,如果時間太長了,LVS就需要緩存大量信息,時間太短了,又不能保證用戶每次被分配到同一台Server上,而且這種方式也不易實現Session的冗餘備份。
因此,我們需要Session共享,也就是說每台Apache都可以訪問到所有的Session,這樣用戶被分配到哪台Server就不重要了。
Session共享主要有多種實現方式:
Session復制。Apache可以實現把Session同步到其他Server上去,但這種技術太復雜,而且影響性能,佔用內存,所以不推薦使用。
Session集中存儲。存儲介質可以是NFS文件系統、資料庫、Memcached,從性能上考慮,當然是Memcached最好,推薦使用。
1.3 實現
1.3.1 安裝Memcached
Memcached是基於libevent實現的,所以要首先確保已經安裝libevent。
安裝libevent
tar zxvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr
make && make install
安裝Memcached
tar zxvf memcached-1.4.4.tar.gz
cd memcached-1.4.4
./configure --prefix=/usr/local/memcached --with-libevent=/usr
make && make install
啟動Memcached
/usr/local/memcached/bin/memcached -d -m 10 -u root -l 192.168.0.9 -p 11211 -c 256 -P /tmp/memcached.pid
1.3.2 安裝php擴展pecl::memcache
pecl install memcache
或源碼安裝
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
phpize
./configure
make && make install
將 php.ini 中 extension=memcache.so 打開,重啟一下 apache,查看 phpinfo 中的 "Registered save handlers" 會有"files user memcache" 這3個可用。
另外,基於libmemached的php擴展在pecl發布了,叫pecl::memcached,性能上可能會更好。
1.3.3 配置Memcached保存Session
修改配置文件,在 php.ini 中全局設置
session.save_handler = memcache
session.save_path = "tcp://192.168.0.9:11211"
或者某個目錄下的 .htaccess :
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.0.9:11211"
再或者在某個一個應用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://192.168.0.9:11211");
使用多個 memcached server 時用逗號","隔開,並且和 Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數"persistent"、"weight"、"timeout"、"retry_interval" 等等,類似這樣的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
1.3.4 測試
<?php
session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "<br><br>";
print $_SESSION['TEST3'];
print "<br><br>";
print session_id();
?>
可以直接用sessionid 去 memcached 里查詢一下:
telnet 192.168.0.9 11211
get
得到
TEST|i:1177556731;TEST3|i:1177556881;
這樣的結果,說明session 正常工作
用Memcached來存儲 session 在讀寫速度上會比文件快很多,而且在多個伺服器需要共用session時會比較方便,將這些伺服器都配置成使用同一組Memcached伺服器就可以,減少了額外的工作量。缺點是 session 數據都保存在 memory 中,持久化方面有所欠缺,但對 session 數據來說也不是很大的問題,如果要持久化數據,也可以使用新浪開發的MemcacheDB或日本人開發的Tokyo tyrant+Tokyo Cabinet。
另外,如何解決Memcached的單點故障問題,有以下幾個方案:
使用上面提到的Memcache::addServer增加多台Memcached,但這樣只能達到一台出故障之後,另外一台可以使用,但每台Memcached的數據是獨立的,不共享,不復制,出故障的數據丟失了。
使用Memcached的一個補丁應用repcached,可以實現multi master replication和asynchronous data repliacation,並且支持原來Memcached的所有命令。不過這個應用只支持Memcached1.2.x版本。
使用Tokyo tyrant+Tokyo Cabinet(簡稱TT+TC)。TT兼容Memcached協議,可以直接替換使用,TT支持replication,可以實現故障轉移,TC則為TT提供持久化。
TT+TC是日本最大的社交類網站mixi.jp開發的開源應用,並已成功應用在mixi.jp中,值得研究。
Ⅱ php 能不能編譯的時候一起加入 memcached 擴展
一 安裝libevent
1.去官網http://libevent.org/ 下載最新源碼,我用的是libevent-2.0.20-stable.tar.gz
2.解壓到/usr/src目錄 ,執行命令:sudo tar -zxvf libevent-2.0.20-stable.tar.gz -C /usr/src
3.進入解壓以後的目錄,用sudo方式執行命令:sudo ./configure --prefix=/usr/local/libevent ; make ; make install
二 安裝memcache
1.去官網 http://memcached.org/ 下最新源碼,我用的是memcached-1.4.15.tar.gz
2.解壓到/usr/src目錄 ,執行命令:sudo tar -zxvf memcached-1.4.15.tar.gz -C /usr/src
3.進入解壓以後的目錄,用sudo方式執行命令:sudo ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent; make ; make install
三 安裝php的memcache擴展
有兩個版本一個是memcache(http://pecl.php.net/package/memcache ),另一個是基於libmemcached的memcached版本(http://pecl.php.net/package/memcached );
網上查的資料是說前一個是原生的,後一個比前一個功能更強大。比較推薦使用基於libmemcahced 庫的memcached擴展。支持memcache提供的CAS操作,穩定性和效率也更好。
這里我使用基於libmemcached 庫的memcached擴展,安裝步驟如下:
首先,安裝libmemcached庫
1.去網址 https://launchpad.net/libmemcached (或者http://libmemcached.org/libMemcached.html )下載源碼,
我用的是libmemcached-1.0.14.tar.gz
2.解壓縮到/usr/src目錄,用sudo方式執行命令:sudo tar -zxvf libmemcached-1.0.14.tar.gz -C /usr/src
3.進入目錄/usr/src/libmemcached-1.0.14/,sudo方式執行命令:./configure ;make;make install (不加--prefix=/usr/local/libmemcached 指定安裝目錄時,libmemcached 默認安裝在/usr/local/,頭文件安裝在/usr/local/include/libmemcachde/,動態庫默認安裝在/usr/local/lib/下。)
4.make時遇到問題:sorry, unimplemented: Graphite loop optimizations can only be used if the libcloog-ppl0 package is installed。解決辦法是修改Makefile,查找並去掉 floop-parallelize-all(應該有兩處需要去掉),看了網上資料說是去掉後表示不使用Graphite loop 優化。
5.再次make,遇到問題:fatal error: sasl/sasl.h: No such file or directory. 在網上搜到的解決辦法是:
Depending on your operating system, you'll need to install the cyrus-sasl development package.
That would be cyrus-sasl-devel on RedHat based distros and libsasl2-dev on Debian based distros IIRC.
我在ubuntu下直接用sudo apt-get install libsasl2-dev 安裝了。
6.編譯還是遇到問題,顯示無法鏈接到sasl的一些文件。問題顯示如下:
undefined reference to `sasl_client_step'
undefined reference to `sasl_dispose'
undefined reference to `sasl_client_start'
undefined reference to `sasl_client_new'
解決辦法是重新執行configure命令,增加相應的參數。sudo執行命令:sudo ./configure --enable-sasl --without-memcached LDFLAGS=-Wl,--as-neede ;make; make install
7.終於安裝libmemcached庫成功了。。。
其次,安裝memcached版本的php擴展
1. 去網址http://pecl.php.net/package/memcached 下載memcached版本,我用的是memcached-2.1.0.tgz
2. 解壓到/usr/src目錄 ,執行命令:sudo tar -zxvf memcached-2.1.0.tgz -C /usr/src
3. 進入解壓以後的目錄,是沒有configure文件的,用sudo方式執行命令來生成:sudo /usr/local/php/bin/phpize
4.遇到問題:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script. 網上搜到的解決辦法為:
cd /usr/src
wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
tar -zvxf m4-1.4.9.tar.gz
cd m4-1.4.9/
./configure && make && make install
cd ../
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
tar -zvxf autoconf-2.62.tar.gz
cd autoconf-2.62/
./configure && make && make install
5.這是再次執行sudo /usr/local/php/bin/phpize,就可以成功生成configure文件了。(phpize是用來擴展php擴展模塊的,通過phpize可以建立php的外掛模塊,官方說明網址為:http://php.net/manual/en/install.pecl.phpize.php)
6.用sudo方式執行命令./configure --with-php-config=/usr/local/php/bin/php-config; make ; make install
7.編譯完成了,還需要做的是在/usr/local/lib/php.ini文件中加入extension值:extension=memcache.so
8.重啟/usr/local/php/sbin/php-fpm程序使配置生效,但是報錯:
ERROR: failed to open configuration file '/usr/local/php/etc/php-fpm.conf': No such file or directory (2)
ERROR: failed to load configuration file '/usr/local/php/etc/php-fpm.conf'
ERROR: FPM initialization failed
解決辦法為: (1)cd /usr/local/php/etc/; (2)mv php-fpm.conf.default php-fpm.conf
9.重啟仍然出現問題:ERROR: [pool www] cannot get uid for user 'www'。解決辦法為:編輯文件vim /usr/local/php/etc/php-fpm.conf,
把user = nobody group = nobody 中的nobody修改成有效的用戶和用戶組名稱。
Ⅲ 如何在Centos的linux操作系統安裝php的memcache擴展
准備工作:
1、一台linux的伺服器
2、下載相應版本的php源碼,知道自己php的版本並且知道phpize的位置
3、懂基本的linux解壓命令和編譯
操作步驟:
1、通過ssh登陸到我們的伺服器,找到我們的phpize位置,如果不知道下載跟目前使用版本相同的php源碼重新編譯一下
2、下載memcached的源碼包,並解壓安裝
wgettar -zxvf memcache-3.0.8.tgz #解壓cd memcache-3.0.8 #進入源碼包/usr/local/php/bin/phpize #執行phpize./configure --with-php-config=/usr/local/php/php-config #准備編譯make && make install #編譯安裝
3、配置php.ini文件在最後面添加擴展進去
vim /etc/php.iniextension=memcache.so
4、重啟web伺服器,我用的是apache
service httpd restart
5、編寫一個phpinfo文件去查看有沒有安裝成功
Ⅳ php7無法安裝memcache擴展 系統 centos-6.8 Nginx-1.10.2 PHP-7.0.13/5.6.28 memcached-1.4
一 下載需要的源碼包
所有安裝包均選用最新的。
1. 下載libevent2.0.22
點擊紅色部分下載
下載memcached1.4.24
點擊紅色部分,下載最新版本
下載php擴展memcache3.0.8
選擇需要的版本
二 安裝詳細步驟
首先將以上三個軟體包下載到/tmp目錄下
1. 安裝libevent
cd /tmp #首先進入到該下載包的目錄
tar zxvf libevent-2.0.22-stable.tar.gz #解壓包cd libevent-2.0.22-stable #進入到解壓的目錄./configure --prefix=/usr/local #編譯前配置,生成Makefile文件,路徑可自行更改make; make install #編譯+安裝
1
測試是否安裝成功
看到這些信息,表示成功啦
2. 安裝memcached
cd /tmp #首先進入到該下載包的目錄
tar zxvf memcached-1.4.24.tar.gz #解壓包
cd memcached-1.4.24 #進入到解壓的目錄
./configure –with-libevent=/usr/local #編譯前配置,生成Makefile文件,路徑必須與libevent中一致make; make install #編譯+安裝
1
測試是否安裝成功
表示成功的信息
通過以上操作,就完成了memcached伺服器的安裝。特別的簡單吧!現在就來搞一搞memcache的php擴展安裝吧3. 安裝擴展
cd /tmp #首先進入到該下載包的目錄
tar zxvf memcache-3.0.8.tgz #解壓包
cd memcache-3.0.8 #進入到解壓的目錄
/opt/lampp/bin/phpize #動態為php添加擴展。phpize路徑可能不一致,請根據自己的實際情況./configure –enable-memcache –with-php-config=/opt/lampp/bin/php-config –with-zlib-dir #php-config請根據自己環境情況填寫make; make install #編譯+安裝
1
完成以上步驟時,心情愉悅的點擊了enter,准備喝口水瀟灑一下,結果出現了一下錯誤(這也是我寫這篇博客的原因,要不都懶得記錄了)錯誤信息
看了下代碼錯誤信息,說是zlib.h找不到。找不到就給他安一個嘛。真是的安裝zlib
下載zlib-1.2.8.tar.gz
下載地址:http://www.zlib.net/
如圖:
紅色部分點擊
cd /tmp #首先進入到該下載包的目錄
tar zxvf zlib-1.2.8.tar.gz #解壓包
cd zlib-1.2.8 #進入到解壓的目錄
./configure --prefix=/usr/local/zlib
make; make install #編譯+安裝
1
再進行配置一下系統的文件,載入剛才編譯安裝的zlib生成的庫文件vi /etc/ld.so.conf.d/zlib.conf
加入如下內容後保存退出: /usr/local/zlib/lib也就是添加安裝目錄的文件路徑,庫文件。ldconfig 運行之後就會載入安裝的庫文件了。
OK,到這一步了,此時,重新在memcache的php擴展中執行make;make install命令如果看到以下信息,表示成功:
擴展安裝成功
三 配置php.ini文件
首先通過phpinfo函數,找到php.ini的路徑,我的是:/opt/lampp/etc/php.ini在其中添加如下內容:
修改extension_dir路徑:
extension_dir = 「/opt/lampp/lib/php/extensions/no-debug-non-zts-20121212/」
extension=memcache.so
[Memcache]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
然後重新啟動apache,再次通過phpinfo查看一下情況。如果有如下內容,表示配置成功:
信息
四 配置memcached伺服器
啟動memcached伺服器
memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid參數說明:
-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB,-u是運行Memcache的用戶,我這里是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這里指定了伺服器的IP地址127.0.0.1,-p是設置Memcache監聽的埠,我這里設置了11211,最好是1024以上的埠,-c選項是最大運行的並發連接數,默認是1024,我這里設置了256,按照你伺服器的負載量來設定,-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid2. 結束memcached進行
kill cat /tmp/memcached.pid
3. 檢查memcached是否已經啟動
看到綠色框中內容,就表示完成
五 測試php的memcache擴展
<?php
$mem = new Memcache;
$mem->connect("192.168.12.201", 13001);
$mem->set('key','This is a test!', 0, 60);$val = $mem->get('key');
echo $val;
?>
寫在後面:大家有興趣可以將session改為使用memcache來保存。php自身使用文件的方式,不太好,動不動文件大小總和就上G了。
Ⅳ 小白談memcache和memcached的區別
1、基於的庫不同。memcache擴展是原生的(基於pecl擴展庫)。memcached擴展是基於libmemcached庫開發的,所以支持cas操作,cas操作就是多個線程並發修改同一個key的值的時候能夠進行處理。
memcache.so和 memcached.so是兩個擴展文件名稱(php中擴展在linux下是.so後綴,window下是dll文件)。也就是後者就要libmemcached庫來實現。
2、mc支持面向對象和面向過程兩套介面操作服務端。而mcd擴展只支持面向對象方式操作。這也是庫(libmemcached與libmemcache)的不同影響的。
3、 memcached支持Binary Protocol,而memcache不支持。還是庫的不同導致。這意味著memcached會有更高的性能。
Ⅵ php 7 有可用的 memcache,redis 擴展嗎
1、PHP Memcache擴展下載
[raykaeso@web ~]$ wget memcache-2.2.7.tgz
2、解壓安裝並進入Memcache目錄
[raykaeso@web ~]$ tar xzf memcache-2.2.7.tgz
[raykaeso@web ~]$ cd memcache-2.2.7
3、在Memcache目錄下,生成configure配置文件
[raykaeso@web memcache-2.2.7]$ /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20090626
Zend Mole Api No: 20090626
Zend Extension Api No: 220090626
[raykaeso@web memcache-2.2.7]$ ./configure –with-php-config=/usr/local/php/bin/php-config
[raykaeso@web memcache-2.2.7]$ make
Ⅶ Fatal error: Class 'Memcache' not found 是怎麼回事啊
php有兩個關於memcache的擴展,都在pecl上,兩者名稱上的區別是末尾有沒有d。
更進一步的說,memcached擴展更多的支持一些多節點、超時設置等方面的支持。
so,你需要的是extension=memcache.so,並重啟apache或php-fpm。
Ⅷ 用ssh編輯php.ini, 輸入vi php.ini之後全都是些介紹,怎麼才能插入 extension=memcache.so
我來回的吧:
# cd /etc //這里是 php.ini 的目錄。可以根據你自己實際情況 切換到 相應的目錄。
# vi php.ini //打開php.ini文件,然後使用方向鍵,上下左右切換到要輸入的地方。
//鍵盤按鍵 i 切換到php.ini文件的編輯模式
//輸入:extension=memcache.so
// 輸入完畢後,按 Esc鍵退出 編輯模式
// 然後按shift+冒號鍵,再輸入wq,再輸入 shift+感嘆號 ,回車即可保存。即 :wq! 保存
Ⅸ php怎麼開啟memcache
下載memcache安裝包和php擴展文件php_memcache.dll。解壓memcache,把memcached移動到C盤。
單擊開始菜單,運行「cmd」。
cd .. //進入c盤
cd memcached //進入memcache目錄
memcache.exe -d install //安裝memcache服務
設置php:找到php安裝目錄,打開php.ini文件。找到配置文件里允許支持擴展的區域exetension=。。,添加一行exetension=php_memcache.dll。
把php擴展文件php_memcache.dll移動到php安裝目錄下的ext目錄下。注意在php.ini中要設置好exetension目錄。php_memcache.dll此文件需要先在網上下載下來!
設置apache:
打開apache配置文件httpd.conf,找到LoadMole載入模塊區域。去掉前面的「LoadMole mem_cache_mole moles/mod_mem_cache.so」#號
重啟apache服務。linux下重啟使用命令:service httpd restart。
然後就大功告成!