首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Zend Framework 實作 Session 儲存至 Memcache 完整方案

     編輯:PHP 相關知識

Zend Framework 實作 Session 儲存至 Memcache 完整方案

預設 Zend Framework 僅支援檔案與資料庫儲存 Session,若需跨伺服器共享 Session 或提升效能,將 Session 寫入 Memcache 是最佳選擇。本文提供完整的 Zend_Session_SaveHandler_Memcached 實作類別與設定範例。

實作 SaveHandler 類別

建立 library/Zend/Session/SaveHandler/Memcached.php,實作 Zend_Session_SaveHandler_Interface 介面,核心方法包含 read、write、destroy、gc 等:

<?php
require_once 'Zend/Session.php';
require_once 'Zend/Config.php';

class Zend_Session_SaveHandler_Memcached implements Zend_Session_SaveHandler_Interface {
    const LIFETIME = 'lifetime';
    const OVERRIDE_LIFETIME = 'overrideLifetime';
    const MEMCACHED = 'memcached';

    protected $_lifetime = false;
    protected $_overrideLifetime = false;
    protected $_memcached;

    public function __construct($config) {
        // 解析設定陣列,建立 Memcache 連線
        if ($config instanceof Zend_Config) $config = $config->toArray();
        foreach ($config as $key => $value) {
            switch ($key) {
                case self::MEMCACHED:
                    $this->createMemcached($value);
                    break;
                case self::LIFETIME:
                    $this->setLifetime($value);
                    break;
                case self::OVERRIDE_LIFETIME:
                    $this->setOverrideLifetime($value);
                    break;
            }
        }
    }

    public function createMemcached($config) {
        $mc = new Memcache;
        foreach ($config as $server) {
            $mc->addServer($server['ip'], $server['port']);
        }
        $this->_memcached = $mc;
    }

    public function read($id) {
        $value = $this->_memcached->get($id);
        if ($value && $this->_getExpirationTime($value) > time()) {
            return $value['data'];
        }
        return '';
    }

    public function write($id, $data) {
        $insertData = ['modified' => time(), 'data' => (string)$data];
        $value = $this->_memcached->get($id);
        if ($value) {
            $insertData['lifetime'] = $this->_getLifetime($value);
            return $this->_memcached->replace($id, $insertData);
        } else {
            $insertData['lifetime'] = $this->_lifetime;
            return $this->_memcached->add($id, $insertData, false, $this->_lifetime);
        }
    }

    public function destroy($id) {
        return $this->_memcached->delete($id);
    }

    public function gc($maxlifetime) { return true; }
    // ... 輔助方法 _getLifetime, _getExpirationTime 省略 ...
}
?>

設定與啟用

在 Bootstrap 或啟動腳本中設定 SaveHandler 並啟動 Session:

<?php
$config = [
    'memcached' => [
        ['ip' => '192.168.0.1', 'port' => 11211],
        ['ip' => '192.168.0.2', 'port' => 11211] // 支援多台分散式
    ],
    'lifetime' => 123334
];
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($config));
Zend_Session::start();
?>

注意事項

  • 需安裝 PHP memcache 擴充套件(非 memcached)。
  • Session 資料會自動序列化/反序列化,使用方式與原生 $_SESSION 完全相同。
  • 多伺服器環境下,確保所有節點連線同一組 Memcache 叢集即可實現 Session 共享。

延伸閱讀

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved