日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

緩存 PHP session 變量

更新時間:

背景介紹

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

問題

云數據庫 Memcache 版和自建的 memcached 都實現了標準 memcached 協議,用戶一方面為了減少服務器內存的占用,一方面減少對 memcached 的維護,希望將 session 的存儲從自建的 memcached 遷移到云數據庫 Memcache 版上面,且不希望改寫代碼,切換過程中遇到了問題,因此有了這篇文章,希望能幫到大家。

云數據庫 Memcache 版和自建的 memcached 最重要的區別就是“賬號密碼鑒權”:

  • 云數據庫 Memcache 版:分布式集群統一對外提供服務,實現了負載均衡且無單點故障,用戶可自由動態彈性調整配置且無需重啟服務。既然是對外提供服務,就有相應的安全機制,如白名單、流控、賬號密碼鑒權。

  • 自建 memcached:因為大多數用戶自建 memcached 是不需要設置賬號密碼的,跟云數據庫 Memcache 版比就少了 SASL 鑒權流程。那么用戶將 session 的存儲從自建的 memcached 遷移到云數據庫 Memcache 上面,就需要在 php.ini 中配置賬號密碼。

解決方案

  1. 在老版本的 php memcached 擴展中無法支持,需要升級 php memcached 擴展至2.2.0版本,示例代碼如下:

    1. wget http://pecl.php.net/get/memcached-2.2.0.tgz
    2. tar zxvf memcached-2.2.0.tgz
    3. cd memcached-2.2.0
    4. phpize
    5. ./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl
    6. make
    7. make install
  2. 找到剛升級 memcached.so,stat 命令確定下是否更新(注意下 modify 時間)。

  3. 修改 php.ini 配置。

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

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

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

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

      修改緩存到 memcached 的 key 的時間:

      1. session.gc_maxlifetime = 1440(單位是秒,強烈建議必須設置一個合理時間,以保證 OCS 始終只緩存熱點數據)
    2. memcached 段:在 php.ini 的全局段,建一個單獨段落[memcached],然后在空白地方加入下面配置:

      1. [memcached]
      2. memcached.use_sasl = On
      3. memcached.sess_binary = On
      4. memcached.sess_sasl_username = "your_ocs_name"
      5. memcached.sess_sasl_password = "your_ocs_password"
      6. memcached.sess_locking = Off

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

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

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

接下來是測試是否生效。

測試

寫測試代碼如下 session.php:

  1. <?php
  2. session_start();
  3. $sn = session_id();
  4. echo "session id:".$sn."\n";
  5. $_SESSION["ocs_key"]="session_value";
  6. echo "session:".$_SESSION["ocs_key"]."\n";
  7. ?>

輸出如下:

  1. session id:ttrct9coa2q62r2sodlq4qf376
  2. session:session_value

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

  1. <?php
  2. $memc = new Memcached();
  3. $memc->setOption(Memcached::OPT_COMPRESSION, false);
  4. $memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
  5. $memc->addServer("be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com", 11211);
  6. $memc->setSaslAuthData("your_ocs_name", "your_ocs_password");
  7. echo $memc->get("memc.sess.key.ttrct9coa2q62r2sodlq4qf376");
  8. /*注意這里的key是有前綴的,由php.ini中memcached.sess_prefix字段決定,默認值為"memc.sess.key."。然后再拼接上面打出來的sessionid“ttrct9coa2q62r2sodlq4qf376”即可。*/
  9. ?>

該代碼輸出如下:

  1. ocs_key|s:13:"session_value";

即 PHP SESSION 已經成功寫入 Memcache。