閱讀514 返回首頁    go 技術社區[雲棲]


如何利用OCS存取PHP session全局變量

作者:餘汶龍

 

一、場景介紹

用戶在利用PHP搭建網站時,會把一些信息存放在$_SESSION全局變量裏,可以很方便的存取。在PHP的ini配置文件裏麵提供了[Session]相關配置,可以支持將信息存到文件或memcached服務器裏麵。由配置項session.save_handler = memcached決定。大多數場景,該session數據並不需要持久化,且為了提升網站性能,會選擇將session信息緩存到memcached裏麵。

 

二、問題

現在問題來了,已知阿裏雲OCS是實現了標準memcached協議的緩存,用戶一方麵為了減少服務器內存占用,一方麵減少對memcached的維護,希望將session的存儲從自建的memcached遷移到OCS上麵,且不希望改寫代碼。切換過程中遇到了問題,因此有了這篇文章,希望能幫到大家。

首先弄清OCS和自建memcached的區別,他們都實現了標準memcached協議。但OCS是分布式集群統一對外提供服務,實現了負載均衡且無單點故障,用戶可自由動態彈性調整配置且無需重啟服務。既然是對外提供服務,就有相應的安全機製,如白名單、流控、賬號密碼鑒權。這裏對比自建memcached,最重要的區別就是“賬號密碼鑒權”,因為大多數用戶自建memcached是不需要設置賬號密碼的,跟OCS比就少了SASL鑒權流程。那麼用戶將session的存儲從自建的memcached遷移到OCS上麵,就需要在php.ini中配置賬號密碼。

 

三、解決

1、在老版本的php memcached擴展中無法支持,需要升級php memcached擴展至2.2.0版本。重新按照阿裏雲OCS官網教程https://help.aliyun.com/view/11108324_13703944.html?spm=5176.7150518.1996836753.9.OZnEq0 編譯擴展。步驟如下:

wget https://pecl.php.net/get/memcached-2.2.0.tgz

tar  zxvf  memcached-2.2.0.tgz

cd memcached-2.2.0

phpize

./configure –with-libmemcached-dir=/usr/local/libmemcached –enable-memcached-sasl

make

make install

 

2、找到剛升級memcached.so,stat命令確定下是否更新,注意下modify時間

1

 

3、修改php.ini配置

3.1 session段

找到[Session]段落,修改存儲引擎為:

session.save_handler = memcached(注意是帶d擴展)

修改存儲地址,即OCS訪問地址為:

session.save_path = “be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com:11211″(注意帶d擴展,則前麵不用加tcp://,不帶d的擴展需要加)

修改緩存到memcached的key的時間

session.gc_maxlifetime = 1440(單位是秒,強烈建議必須設置一個合理時間,以保證OCS始終隻緩存熱點數據)

3.2 memcached段

在php.ini的全局段,建一個單獨段落[memcached],然後在空白地方加入下麵配置

[memcached]

memcached.use_sasl = On

memcached.sess_binary = On

memcached.sess_sasl_username = “your_ocs_name”

memcached.sess_sasl_password = “your_ocs_password”

memcached.sess_locking = Off

安裝步驟完結,上述關於memcached段和Session段其他有用參數,參考鏈接如下:

https://php.net/manual/en/memcached.configuration.php

https://php.net/manual/en/session.configuration.php

接下來是測試是否生效。

 

四、測試

寫測試代碼如下session.php

<?php

session_start();

$sn = session_id();

echo “session id:”.$sn.”\n”;

$_SESSION["ocs_key"]=”session_value”;

echo “session:”.$_SESSION["ocs_key"].”\n”;

?>

 

輸出如下:

session id:ttrct9coa2q62r2sodlq4qf376

session:session_value

 

測試代碼get.php去從OCS獲取剛才session.php通過session寫入的數據

<?php

$memc = new Memcached();

$memc->setOption(Memcached::OPT_COMPRESSION, false);

$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);

$memc->addServer(“be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com”, 11211);

$memc->setSaslAuthData(“your_ocs_name”, “your_ocs_password”);

echo $memc->get(“memc.sess.key. ttrct9coa2q62r2sodlq4qf376″);

/*注意這裏的key是有前綴的,由php.inimemcached.sess_prefix字段決定,默認值為“memc.sess.key.”。然後再拚接上麵打出來的sessionidttrct9coa2q62r2sodlq4qf376”即可。*/

?>

 

該代碼輸出如下:

  • ocs_key|s:13:”session_value”;

即PHP SESSION已經成功寫入OCS。

最後更新:2017-04-03 05:39:52

  上一篇:go 五大常用算法 之 動態規劃法
  下一篇:go [人工智能]北美18名校的數據挖掘,數據分析,人工智能及機器學習課程匯總