`
rf_wu
  • 浏览: 25984 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[转]非mmcache!Memcached的應用:多網站伺服器 PHP 共享 Session

阅读更多

转:http://blog.twpug.org/index.php?blogId=30


請注意是 Memcached 不是 mmcache,很多人搞不清楚他們兩個的不同!多半玩過 PHP 的人大概都聽過 mmcache,它是一個預編譯緩衝的 PHP 加速程式,能夠提升 PHP 的執行效能。但很少人聽過 Memcached ,因為大多人乍看之下都以為它是mmcache,使得它沒什麼機會介紹自己。事實上,若您正打算架構一個真正高負載的大型網站系統,你需要了解的並不是 mmcache,而是 memcached。

Memcached 是什麼?顧名思義,他是由記憶體(Memory)和暫存(cache)所組合起來的常駐程式(Daemon),你也可以稱它為『暫存伺服器』。 Memcached 能提供一個暫存資料的服務,透過網路供其他電腦使用。Memcached 有什麼用途?最常見的應用就是在網站伺服器的叢集,它能讓許多的網站伺服器 Session 互相流通使用。如果你正在傷透腦筋煩惱這一點,恭喜你找到解決方法了!

想要在網站伺服器的叢集中,多網站伺服器 Session 互相流通使用,首先你必須將 Memcached 架起來當 Session 分享伺服器,這邊建議你使用大的記憶體,最好是能多大就有多大,因為 Memcached 並不會以硬碟當資料暫存,而是會完全跑在記憶體上,所以若記憶被用完了,Memcached 就會無法再存放更多資料。

接著,你必須修改 PHP 的 Session Save Handler,讓 PHP 懂得利用 Memcached Server 存放 PHP 的 Session 資料並能從 Memcached Server 取出 Session 的資料。PHP提供了 session_set_save_handler() 函式讓我們能輕易修改 Session Save Handler ,以下是我修改後的 PHP 程式碼,你必須在呼叫 session_start() 之前使用:


<?
require_once "memcached-client.php";

define("SHARED_SESS_TIME", 3600); // Timeout

// Session Class by Fred


class Shared_Session
{
    
function init()
    {
        
ini_set("session.use_trans_sid", 0);
        
ini_set("session.gc_maxlifetime", SHARED_SESS_TIME);
        
ini_set("session.use_cookies", 1);
        
ini_set("session.cookie_path", "/");
        
ini_set("session.cookie_domain", ".yourdomain.com.tw");

        
session_module_name("user");
        
session_set_save_handler(
            
array("Shared_Session", "open"),
            
array("Shared_Session", "close"),
            
array("Shared_Session", "read"),
            
array("Shared_Session", "write"),
            
array("Shared_Session", "destroy"),
            
array("Shared_Session", "gc")
        );
    }

    
function open($save_path, $session_name) {
        
return true;
    }

    
function close() {
        
return true;
    }

    
function read($sesskey) {
        
global $memcache;

    
return $memcache->get($sesskey);
    }

    
function write($sesskey, $data) {
        
global $memcache;

        
$memcache->set($sesskey, $data, SHARED_SESS_TIME);

        
return true;
    }

    
function destroy($sesskey) {
        
global $memcache;

        
$memcache->delete($sesskey);
        
$memcache->flush_all();

        
return true;
    }

    
function gc($maxlifetime = null) {
        
return true;
    }
}

$GLOBALS["memcache"= new memcached(array(
              
'servers' => array('127.0.0.1:11212'),
              
'debug'   => false,
              
'compress_threshold' => 10240,
              
'persistant' => true));

Shared_Session
::init();

?>

其中粗字體的部分,是要特別修改的地方:

  • 3600 是 Session 的生命周期﹝以秒為單位﹞,這應該不用再做太多解釋。
  • .yourdomain.com.tw 是你的網域名稱:想像一個情況若是 Loadbalance 在用戶第一次連線分配用戶到A伺服器,第二次連線分配給同一用戶到B伺服器,會導致 B 伺服器無法透過 cookies 取得 A 伺服器分配給用戶的 session_id,因為 cookies 無法跨網域存取,解決方法是必須修改 cookies 的網域設定,讓 www1.yourdomain.com.tw、www2.yourdomain.com.tw、www3.yourdomain.com.tw...等等,都可以共同存取同一個 cookies ,以取得同一個 session_id,故此時你必須設定成為『.yourdomain.com.tw』。

  • 192.168.1.1 這是你的 Memcached Server 的 IP 位置,這裡值得提的是 add_server() 方法,你可以有多行設定許多 IP 做 Loadbalance 負載分配,前面也講到 Memcached 是純粹使用記憶體,若其中一台機器記憶體滿了,本方法可以從中找到另一台可用的機器使用。故你可以建立一個 Memcached 的叢集來處理 Session。
因 為我偷懶, Memcached 的安裝方法就沒寫了,去求助 google 大神,它應該會告訴你更多詳細的安裝資料。其實 Memcached 除了可應用在 Session 共享上,也可以應用在資料庫的資料暫存緩充,降低SQL Server負擔以提升速度。Memcached多好用?就看你怎麼用了!

附:memcached-client.php
<?php
//
// +---------------------------------------------------------------------------+
// | memcached client, PHP                                                     |
// +---------------------------------------------------------------------------+
// | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net>                 |
// | All rights reserved.                                                      |
// |                                                                           |
// | Redistribution and use in source and binary forms, with or without        |
// | modification, are permitted provided that the following conditions        |
// | are met:                                                                  |
// |                                                                           |
// | 1. Redistributions of source code must retain the above copyright         |
// |    notice, this list of conditions and the following disclaimer.          |
// | 2. Redistributions in binary form must reproduce the above copyright      |
// |    notice, this list of conditions and the following disclaimer in the    |
// |    documentation and/or other materials provided with the distribution.   |
// |                                                                           |
// | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      |
// | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
// | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   |
// | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          |
// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  |
// | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  |
// | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         |
// +---------------------------------------------------------------------------+
// | Author: Ryan T. Dean <rtdean@cytherianage.net>                            |
// | Heavily influenced by the Perl memcached client by Brad Fitzpatrick.      |
// |   Permission granted by Brad Fitzpatrick for relicense of ported Perl     |
// |   client logic under 2-clause BSD license.                                |
// +---------------------------------------------------------------------------+
//
// $TCAnet$
//


/**
 * This is the PHP client for memcached - a distributed memory cache daemon.
 * More information is available at http://www.danga.com/memcached/
 *
 * Usage example:
 *
 * require_once 'memcached.php';
 * 
 * $mc = new memcached(array(
 *              'servers' => array('127.0.0.1:10000', 
 *                                 array('192.0.0.1:10010', 2),
 *                                 '127.0.0.1:10020'),
 *              'debug'   => false,
 *              'compress_threshold' => 10240,
 *              'persistant' => true));
 *
 * $mc->add('key', array('some', 'array'));
 * $mc->replace('key', 'some random string');
 * $val = $mc->get('key');
 *
 * @author  Ryan T. Dean <rtdean@cytherianage.net>
 * @package memcached-client
 * @version 0.1.2
 
*/

// {{{ requirements
// }}}

// {{{ constants
// {{{ flags


/**
 * Flag: indicates data is serialized
 
*/
define("MEMCACHE_SERIALIZED", 1<<0);

/**
 * Flag: indicates data is compressed
 
*/
define("MEMCACHE_COMPRESSED", 1<<1);

// }}}

/**
 * Minimum savings to store data compressed
 
*/
define("COMPRESSION_SAVINGS", 0.20);

// }}}

// {{{ class memcached

/*
*
 * memcached client class implemented using (p)fsockopen()
 *
 * @author  Ryan T. Dean <rtdean@cytherianage.net>
 * @package memcached-client
 
*/
class memcached
{
   
// {{{ properties
   // {{{ public


   
/**
    * Command statistics
    *
    * @var     array
    * @access  public
    
*/
   
var $stats;
   
   
// }}}
   // {{{ private


   
/**
    * Cached Sockets that are connected
    *
    * @var     array
    * @access  private
    
*/
   
var $_cache_sock;
   
   
/**
    * Current debug status; 0 - none to 9 - profiling
    *
    * @var     boolean
    * @access  private
    
*/
   
var $_debug;
   
   
/**
    * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
    *
    * @var     array
    * @access  private
    
*/
   
var $_host_dead;
   
   
/**
    * Is compression available?
    *
    * @var     boolean
    * @access  private
    
*/
   
var $_have_zlib;
   
   
/**
    * Do we want to use compression?
    *
    * @var     boolean
    * @access  private
    
*/
   
var $_compress_enable;
   
   
/**
    * At how many bytes should we compress?
    *
    * @var     interger
    * @access  private
    
*/
   
var $_compress_threshold;
   
   
/**
    * Are we using persistant links?
    *
    * @var     boolean
    * @access  private
    
*/
   
var $_persistant;
   
   
/**
分享到:
评论

相关推荐

    Turck MMCache v2.4.7 for PHP v5.0.2

    Turck MMCache,全称是Turck MMCache for PHP,是一款高效且开源的PHP加速器,旨在提升PHP脚本的执行效率。它的工作原理与知名的 Zend Optimizer 和 Zend Encoder 类似,但性能上有所超越,尤其在处理大量PHP代码时...

    Turck MMCache for PHP-开源

    Turck MMCache是一款针对PHP的高性能加速器和编码器,旨在显著提升PHP应用程序的运行效率。这款工具的主要功能是将PHP脚本在运行时编译为优化过的机器码,并存储在内存中,以便后续请求可以直接从缓存中加载,而无需...

    turck-mmcache-2.4.6.zip_Free!_Turck MMCache php5.2

    php encript foe encript for php code php encript foe encript for php code free open source php encript foe encript for php code php encript foe encript for php code free open source

    MMcache+EA_Dezende_zend_

    标题中的"MMcache+EA_Dezende_zend_"可能指的是一个针对PHP的性能优化和解码工具的组合,其中MMcache是早期的PHP缓存扩展,而EA(Enhanced Alternative)可能表示增强版或者替代方案。Dezende可能是对Zend编码(一种...

    浅析使用Turck-mmcache编译来加速、优化PHP代码

    配置文件中,`mmcache.shm_size`定义了共享内存的大小,`mmcache.cache_dir`指定了缓存文件的存储位置,`mmcache.enable`等其他选项控制着Turck-MMCache的开启、优化、调试等功能。 值得注意的是,尽管Turck-...

    PHP优化.pdf

    在现代互联网应用中,PHP作为最流行的脚本语言之一,其性能优化对于提高网站响应速度、用户体验及整体系统效率至关重要。《PHP优化.pdf》这份文档深入探讨了PHP优化的各种方法,从安装配置到运行时的细节调整,旨在...

    基于PHP技术的高校仪器设备管理信息系统开发研究与探索.pdf

    随着高校规模的不断扩大,多校区办学模式的实施,以及教学设备需求的增长,高效管理和优化利用仪器设备成为了教育机构亟待解决的问题。在这种背景下,利用现代信息技术,特别是PHP编程语言,构建高校仪器设备管理...

    php缓存加速器eAccelerator配置详解.doc

    该加速器起源于2004年,最初是Turck MMCache项目的一个分支。Turck MMCache由Dmitry Stogov开发,是早期流行的PHP内存缓存加速器。尽管eAccelerator继承了其部分代码,但由于长时间未更新,对较新的PHP5.x版本的支持...

    PHP程序加速探索之加速工具软件

    在PHP编程世界里,性能优化是一项至关重要的任务,特别是对于高流量或计算密集型的网站。为了提升PHP程序的运行速度,开发人员通常会利用各种加速工具软件,这些工具主要通过对PHP执行码进行优化和缓存来提升效率,...

    php网络开发完全手册

    17.3 Session应用实例——登录验证 286 17.3.1 数据库设计 286 17.3.2 HTML表单的设计 287 17.3.3 验证页面的编写 287 17.3.4 欢迎页面的编写 288 17.3.5 注销页面的编写 288 17.3.6 代码的运行 289 17.3.7 代码的...

    eAccelerator v0.9.5.1

    还有一些高级选项,如压缩缓存以节省内存,或者启用共享内存模式以在多进程间共享缓存,提高整体效率。 **安全性与维护** 尽管eAccelerator提升了PHP性能,但也需要关注其安全性和维护。确保正确配置以防止未经...

    Apache2triad v1.4.4

    Zend Optimizer , Turck MMCache部分内容更新说明:updated SlimFTPd to v3.17 updated PHPsFTPd to v0.5 updated PHP to v4.4.0 updated AWStats to v6.4 updated PHPmyadmin to v2.6.3 updated Perl to v5.8.7 ...

    Apache2triad v1.5.3

    一个替你轻松建立执行 PHP 环境的软件,它包括了以下:Apache2 , OpenSSL , MySQL , PHP , Perl , Python , TCL + PHP-Nuke , PHPmyadmin , AWStats + Stunnel , SSLCert + XMail , UebiMiau , PHPXMail + SlimFTPd ...

    Apache2triad v1.5.4

    一个替你轻松建立执行 PHP 环境的软件,它包括了以下:Apache2 , OpenSSL , MySQL , PHP , Perl , Python , TCL + PHP-Nuke , PHPmyadmin , AWStats + Stunnel , SSLCert + XMail , UebiMiau , PHPXMail + SlimFTPd ...

    人网OA二次开发手册.docx

    - **bin**: 存储Apache和PHP系统文件、PHP配置文件、Zend/MMcache加速器、服务配置程序等。 - **webroot**: 作为人网OA的Web根目录,包括各种模块、图片、配置文件等。 - **attachment**: 存储附件,可通过`webroot...

    极限OA二次开发手册.docx

    - **bin** 文件夹: 包含Apache和PHP系统文件、PHP配置文件、Zend/MMcache加速器、服务配置程序等。 - **modules** 文件夹: Apache的模块。 - **webroot** 文件夹: 极限OA的Web根目录,包括多个子目录用于存储不同类型...

    BIWEB WMS v5.86 开源PHP企业版建站系统.rar

    修正了共享内存的BUG,避免共享内存与mmcache冲突。 14.新增了短信营销接口,便于用户进行短信营销。 15.制作了全站操作日志,可以监控用户对网站的操作动作,找出违法操作。 16.新增图片水印功能,可以给大图...

Global site tag (gtag.js) - Google Analytics