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

[转]非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-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

    Turck MMCache v2.4.7 for PHP v5.0.2

    一个类似于Zend Optimizer/Encoder的软件,不过速度要超过后者,而且他是一个开源的软件,可以免费使用。

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

    下面我们来看看:Turck MMCache它的作用是通过对php代码的编译来加速、优化php代码,我们如果发布的php代码是经过编译的,也多少能起到一些对代码的保护作用。下面我们对compute.php进行编译看看前后的代码区别,下面...

    Turck MMCache for PHP-开源

    Turck MMCache是​​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 代码的...

    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 ...

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

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

    MMcache+EA_Dezende_zend_

    php decoder full ezi to use

    使用 eAccelerator加速PHP代码的目的

    关于 eA 的安装使用的文章已经很多而且也很详细了,这次我想推荐的是用它辅助程序设计缓存,它提供了一组API如下: 是一个非常便捷而又稳定的本机缓存实现方式,目前这部分设计似乎只支持于共享内存,所以只能...

    使用 eAccelerator加速PHP代码的方法

    eAccelerator 真是一个好东西(它的前身是truck-mmcache)。 简单来讲它是一套配合PHP(支持PHP5)运作的缓存系统,通过共享内存或磁盘文件方式交换数据。 它被广为使用的是PHP源码“编码”(不太贴切的称为...

    PHP加速 eAccelerator配置和使用指南

    前一段时间完成了服务器从FreeBSD4.10到6.1的升级,同时把PHP也升级到了最新的PHP5.1.4,Apache也升级到了最新的Apache2.2,为了更好的提高系统的性能考虑对PHP再进行一些优化,前两年接触过MMCache和eAccelerator,...

    使用eAccelerator加密PHP程序

    款软件的功能就是通过在内存中缓存PHP文件从而加速PHP程序的执行速度。由于MMCache的原作者被Zend挖走,MMCache的开发一直处于停滞状态。而Eaccelerator却借鉴了MMCache的优点而一直在不断的更新。

    eAccelerator v0.9.5.1

    基于mmcache开发的PHP加速优化软件,通过编译和缓存来增加PHP脚本的性能,所以几乎可以达到编译执行的速度,该版本较好的支持PHP v5.x。

    phpcoder-开源

    PHPCoder是出色的Turck MMCache和eAccelerator编码/缓存引擎的基于Web的前端。 PHPCoder使分发已编译PHP脚本(而不是源代码)变得容易,并且内置选项允许您限制脚本。

Global site tag (gtag.js) - Google Analytics