Archive for 二月, 2010

zendframework session memcached 应用改进


26 2月
曾经转载过的一篇文章中提到的使用方法,似乎对其中某台memcached服务器down掉后的处理比较欠缺一些,貌似会报出异常导致无法正常运行,可能是原文作者当时memcached还处于一个比较早的阶段,还未有相应的错误处理,经研究后将其修改如下,解决了相应问题:
  1. <?php
  2. require_once ‘Zend/Session.php’;
  3. require_once ‘Zend/Config.php’;
  4.  
  5. class Zend_Session_SaveHandler_Memcached implements Zend_Session_SaveHandler_Interface
  6. {
  7.     const LIFETIME          = ‘lifetime’;
  8.     const OVERRIDE_LIFETIME = ‘overrideLifetime’;
  9.     const MEMCACHED            = ‘memcached’;
  10.     protected $_lifetime = false;
  11.     protected $_overrideLifetime = false;
  12.     protected $_sessionSavePath;
  13.     protected $_sessionName;
  14.     protected $_memcached;
  15.     /**
  16.      * Constructor
  17.      *
  18.      * $config is an instance of Zend_Config or an array of key/value pairs containing configuration options for
  19.      * Zend_Session_SaveHandler_Memcached . These are the configuration options for
  20.      * Zend_Session_SaveHandler_Memcached:
  21.      *
  22.      *
  23.      *      sessionId       =>  The id of the current session
  24.      *      sessionName     => The name of the current session
  25.      *      sessionSavePath => The save path of the current session
  26.      *
  27.      * modified            => (string) Session last modification time column
  28.      *
  29.      * lifetime          => (integer) Session lifetime (optional; default: ini_get('session.gc_maxlifetime'))
  30.      *
  31.      * overrideLifetime => (boolean) Whether or not the lifetime of an existing session should be overridden
  32.      *      (optional; default: false)
  33.      *
  34.      * @param Zend_Config|array $config      User-provided configuration
  35.      * @return void
  36.      * @throws Zend_Session_SaveHandler_Exception
  37.      */
  38.     public function __construct($config)
  39.     {
  40.         if ($config instanceof Zend_Config) {
  41.             $config = $config->toArray();
  42.         } else if (!is_array($config)) {
  43.             /**
  44.              * @see Zend_Session_SaveHandler_Exception
  45.              */
  46.             require_once 'Zend/Session/SaveHandler/Exception.php';
  47.  
  48.             throw new Zend_Session_SaveHandler_Exception(
  49.                 '$config must be an instance of Zend_Config or array of key/value pairs containing '
  50.               . 'configuration options for Zend_Session_SaveHandler_Memcached .');
  51.         }
  52.  
  53.         foreach ($config as $key => $value) {
  54.             do {
  55.                 switch ($key) {
  56.                     case self::MEMCACHED:
  57.                         $this->createMemcached($value);
  58.                         break;
  59.                     case self::LIFETIME:
  60.                         $this->setLifetime($value);
  61.                         break;
  62.                     case self::OVERRIDE_LIFETIME:
  63.                         $this->setOverrideLifetime($value);
  64.                         break;
  65.                     default:
  66.                         // unrecognized options passed to parent::__construct()
  67.                         break 2;
  68.                 }
  69.                 unset($config[$key]);
  70.             } while (false);
  71.         }
  72.     }
  73.  
  74.     /**
  75.      * 创建memcached连接对象
  76.      *
  77.      * @return void
  78.      */
  79.     public function createMemcached($config){
  80.                 $this->_memcached = new Memcache;
  81.                 foreach ($config as $value){
  82.                         $this->_memcached->addServer($value['host'], $value['port'], $value['persistent'],
  83.                                                         $value['weight'], $value['timeout'],
  84.                                                         $value['retry_interval'],
  85.                                                         $value['status'],
  86.                                                                                 array($this,'_callback_memcache_failure'));
  87.                 }
  88.     }
  89.  
  90.         public function _callback_memcache_failure($host,$port){
  91.                 $this->_memcached->setServerParams($host, $port,5,15,false);
  92.         }
  93.  
  94.     public function __destruct()
  95.     {
  96.         Zend_Session::writeClose();
  97.     }
  98.    /**
  99.      * Set session lifetime and optional whether or not the lifetime of an existing session should be overridden
  100.      *
  101.      * $lifetime === false resets lifetime to session.gc_maxlifetime
  102.      *
  103.      * @param int $lifetime
  104.      * @param boolean $overrideLifetime (optional)
  105.      * @return Zend_Session_SaveHandler_Memcached
  106.      */
  107.     public function setLifetime($lifetime, $overrideLifetime = null)
  108.     {
  109.         if ($lifetime < 0) {
  110.             /**
  111.              * @see Zend_Session_SaveHandler_Exception
  112.              */
  113.             require_once 'Zend/Session/SaveHandler/Exception.php';
  114.             throw new Zend_Session_SaveHandler_Exception();
  115.         } else if (empty($lifetime)) {
  116.             $this->_lifetime = (int) ini_get('session.gc_maxlifetime');
  117.         } else {
  118.             $this->_lifetime = (int) $lifetime;
  119.         }
  120.  
  121.         if ($overrideLifetime != null) {
  122.             $this->setOverrideLifetime($overrideLifetime);
  123.         }
  124.  
  125.         return $this;
  126.     }
  127.     /**
  128.      * Retrieve session lifetime
  129.      *
  130.      * @return int
  131.      */
  132.     public function getLifetime()
  133.     {
  134.         return $this->_lifetime;
  135.     }
  136.     /**
  137.      * Set whether or not the lifetime of an existing session should be overridden
  138.      *
  139.      * @param boolean $overrideLifetime
  140.      * @return Zend_Session_SaveHandler_Memcached
  141.      */
  142.     public function setOverrideLifetime($overrideLifetime)
  143.     {
  144.         $this->_overrideLifetime = (boolean) $overrideLifetime;
  145.  
  146.         return $this;
  147.     }
  148.     public function getOverrideLifetime()
  149.     {
  150.         return $this->_overrideLifetime;
  151.     }
  152.     /**
  153.      * Retrieve session lifetime considering
  154.      *
  155.      * @param array $value
  156.      * @return int
  157.      */
  158.     public function open($save_path, $name)
  159.     {
  160.         $this->_sessionSavePath = $save_path;
  161.         $this->_sessionName     = $name;
  162.  
  163.         return true;
  164.     }
  165.     /**
  166.      * Retrieve session expiration time
  167.      *
  168.      * @param * @param array $value
  169.      * @return int
  170.      */
  171.     public function close()
  172.     {
  173.         return true;
  174.     }
  175.  
  176.     public function read($id)
  177.     {
  178.         $return = '';
  179.  
  180.         $value = $this->_memcached->get($id);                        //获取数据
  181.  
  182.         if ($value) {
  183.             if ($this->_getExpirationTime($value) > time()) {
  184.                 $return = $value['data'];
  185.             } else {
  186.                 $this->destroy($id);
  187.             }
  188.         }
  189.  
  190.         return $return;
  191.     }
  192.  
  193.     public function write($id, $data)
  194.     {
  195.         $return = false;
  196.  
  197.         $insertDate = array('modified' => time(),
  198.                               'data'     => (string) $data);
  199.  
  200.            $value = $this->_memcached->get($id);                        //获取数据
  201.  
  202.         if ($value) {
  203.             $insertDate['lifetime'] = $this->_getLifetime($value);
  204.  
  205.             if ($this->_memcached->replace($id,$insertDate)) {
  206.                 $return = true;
  207.             }
  208.         } else {
  209.             $insertDate['lifetime'] = $this->_lifetime;
  210.  
  211.             if ($this->_memcached->add($id, $insertDate,false,$this->_lifetime)) {
  212.                 $return = true;
  213.             }
  214.         }
  215.  
  216.         return $return;
  217.     }
  218.  
  219.     public function destroy($id)
  220.     {
  221.         $return = false;
  222.  
  223.         if ($this->_memcached->delete($id)) {
  224.             $return = true;
  225.         }
  226.  
  227.         return $return;
  228.     }
  229.  
  230.     public function gc($maxlifetime)
  231.     {
  232.         return true;
  233.     }
  234.  
  235.     protected function _getLifetime($value)
  236.     {
  237.         $return = $this->_lifetime;
  238.  
  239.         if (!$this->_overrideLifetime) {
  240.             $return = (int) $value['lifetime'];
  241.         }
  242.  
  243.         return $return;
  244.     }
  245.  
  246.     protected function _getExpirationTime($value)
  247.     {
  248.         return (int) $value['modified'] + $this->_getLifetime($value);
  249.     }
  250. }
  251.  
  252. //使用方法也做了相应的调整:
  253. // Memcached Config
  254. $_MemcachedConfig = array(
  255.     'memcached'=> array(
  256.         array(
  257.             'host'=>'www.yoohouse.com',
  258.             'port'=>12000,
  259.                 'persistent'=>true,
  260.                 'weight' => 1,
  261.                     'timeout' => 5,
  262.                     'retry_interval' => 15,
  263.                     'status' => true
  264.         ),
  265.         array(
  266.             'host'=>'www.yoohouse.com',
  267.             'port'=>12001,
  268.                 'persistent'=>true,
  269.                 'weight' => 1,
  270.                     'timeout' => 5,
  271.                     'retry_interval' => 15,
  272.                     'status' => true
  273.         )
  274.     ),
  275.     'lifetime' =>86400
  276. );
  277.  
  278. // Zend Session 设置、启动。Memcached使用。
  279. Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($_MemcachedConfig));
  280. Zend_Session::start();
  281.  
  282. //同一个config数组还可以同时用于zend_cache:
  283. // Zend Cache 缓存设置,Memcached使用。
  284. $frontendOptions = array(
  285.    'lifeTime' => 7200,
  286.    'automatic_serialization' => true
  287. );
  288. $backendOptions = array(
  289.     'servers' => $_MemcachedConfig['memcached']
  290. );
  291. $cache = Zend_Cache::factory('Core',
  292.                              'Memcached',
  293.                              $frontendOptions,
  294.                              $backendOptions);
以上,如有问题欢迎指教

TortoiseSVN初始设置


26 2月
1.右键->TortoiseSvn->Settings->编辑设置文件 2.去掉 no-unlock = yes (每次提交不自动锁定)和 enable-auto-props = yes(开启自动属性功能) 的注释 3.在config文件的最后加上: * = svn:needs-lock=x *.css = svn:keywords=Id ;svn:eol-style=native *.php = svn:keywords=Id ;svn:eol-style=native *.html = svn:keywords=Id ;svn:eol-style=native *.phtml = svn:keywords=Id ;svn:eol-style=native *.js = svn:keywords=Id ;svn:eol-style=native *.txt = svn:keywords=Id ;svn:eol-style=native (说明:第一行为自动为每一个add的文件加上必须锁定的标记,后面几行的功能是,自动替换文件中以“$Id xxx$”字样成每次提交的svn版本及用户信息等。) 4. global-ignores = Thumbs.db

Q: PHP中数组查找key快还是查找value快?


26 2月
前两天被人问到这个问题,貌似sb了一几。 回头仔细想想貌似于情于理的确是key要快点,好比内存池,key就是指针,value就是其中指向的内容,把搜索臆想为一个简单的顺序查找算法,那么一定是先到key然后再进去到value,value已经是第二级了,那显然只查第一级要快许多了。 事实结果也是如此,虽然没有去深究php的两个函数底层是怎么写的,但查到的资料表明,array_key_exist,要比in_array效率高十几甚至几十倍呢。 看来偶在这种快速反应的时候,还是有很大欠缺的,心里素质不高呀。。。

貓熊寶寶幼齒園

姜經緯的博客