Archive for the ‘Code’ Category

【转】提升PHP执行效率的建议


17 3月
0、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。 1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row[’id’] 的速度是$row[id]的7倍。 3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。 4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。 5、注销那些不用的变量尤其是大数组,以便释放内存。 6、尽量避免使用__get,__set,__autoload。 7、require_once()代价昂贵。 8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。 9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。 10、函数代替正则表达式完成相同功能。 11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。 12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。 13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。 14、用@屏蔽错误消息的做法非常低效,极其低效。 15、打开apache的mod_deflate模块,可以提高网页的浏览速度。 16、数据库连接当使用完毕时应关掉,不要用长连接。 17、错误消息代价昂贵。 18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。 19、递增一个全局变量要比递增一个局部变量慢2倍。 20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。 21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。 22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。 23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。 24、派生类中的方法运行起来要快于在基类中定义的同样的方法。 25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。 26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。 27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。 28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。 29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。 (举例如下) if (strlen($foo) < 5) { echo “Foo is too short”$$ } (与下面的技巧做比较) if (!isset($foo{5})) { echo “Foo is too short”$$ } 调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。 34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。 35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。 36、并非要用类实现所有的数据结构,数组也很有用。 37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码? 38、当你需要时,你总能把代码分解成方法。 39、尽量采用大量的PHP内置函数。 40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。 41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。 42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。 43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题; 44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的; 45、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过); 46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!); 47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?); 48、多维数组尽量不要循环嵌套赋值; 49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式; 50、foreach效率更高,尽量用foreach代替while和for循环; 51、用单引号替代双引号引用字符串; 52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”; 53、对global变量,应该用完就unset()掉;

Xdebug相关整理


17 3月
一般的功能说明直接看文档: http://xdebug.org/docs/ 使用下来感觉比较好的profiler分析工具: web版:http://code.google.com/p/webgrind/ windows:http://sourceforge.net/projects/wincachegrind web版的功能稍弱点,不知道有没有更好的替代,但相对本地版的,web版比较方便,但本地的分析更到位一些。 另外remote功能因为不习惯用IDE,所以只实验了http://code.google.com/p/xdebugclient/ 感觉还行,反正我写代码一般很少需要调试的样子,多年养成的习惯了,也许今后超大型的东西,会用到吧。 设置似乎异常简单,随便贴一点php.ini段落: zend_extension="/usr/local/xdebug/lib/xdebug.so" xdebug.profiler_enable=1 xdebug.profiler_output_dir="/home/yoohouse/public_html/xdebug" xdebug.profiler_output_name="cachegrind.out.%R" xdebug.remote_enable=1 xdebug.remote_host="192.168.4.26" 反正看着docs一般都能会。 应该说Xdebug的重点还是在于使用后,要怎样实现代码上的改进,工具本身没什么花头。 一些还没看的中文资料: http://www.ccvita.com/352.html

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);
以上,如有问题欢迎指教

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


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

Zendframework Feed


25 6月
参考:http://www.developer.com/lang/article.php/10924_3807001_1
  1. public function populargamesAction()
  2. {
  3.  
  4.     // Create array to store the RSS feed entries
  5.     $entries = array();
  6.    
  7.     // Retrieve the 25 most popular games
  8.     $game = new Game();
  9.     $rankings = $game->getLatestSalesRanks(25);
  10.    
  11.     // Cycle through the rankings, creating an array storing
  12.     // each, and push the array onto the $entries array
  13.     foreach ($rankings AS $ranking) {
  14.         $entry = array(
  15.           'title'       => "{$ranking->title}
  16.                           ({$ranking->platform})",
  17.           'link'        => "http://www.gamenomad.com/games/
  18.                            {$ranking->asin}",
  19.           'description' => "Sales Rank: #{$ranking->rank}",
  20.         );
  21.         array_push($entries, $entry);
  22.     }
  23.    
  24.     // Create the RSS array
  25.     $rss = array(
  26.       'title'   => 'GameNomad: Popular Games',
  27.       'link'    => 'http://www.gamenomad.com/games/ranks',
  28.       'charset' => 'ISO-8859-1',
  29.       'entries' => $entries
  30.     );
  31.    
  32.     // Import the array
  33.     $feed = Zend_Feed::importArray($rss, 'rss');
  34.    
  35.     // Write the feed to a variable
  36.     $rssFeed = $feed->saveXML();
  37.    
  38.     // Write the feed to a file residing in /public/rss
  39.     $fh = fopen($this->config->feed->popular_games, "w");
  40.     fwrite($fh, $rssFeed);
  41.     fclose($fh);
  42.    
  43. }

Memcached Zendframework SESSION 應用(转)


24 6月
在zend framework中,已经可以将session存储在数据库中了,不过还不支持memcache,我简单得实现了一下。 下面是SaveHandler,文件名为 :Memcached.php ,将其放在 /Zend/Session/SaveHandler 目录下,代码如下(需要有php_memcache支持,因为字符长度限制,我把部分注释去掉了):
  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.       $mc = new Memcache;
  81.       foreach ($config as $value){
  82.         $mc->addServer($value['host'], $value['port']);
  83.       }
  84.       $this->_memcached = $mc;
  85.     }
  86.  
  87.     public function __destruct()
  88.     {
  89.         Zend_Session::writeClose();
  90.     }
  91.    /**
  92.      * Set session lifetime and optional whether or not the lifetime of an existing session should be overridden
  93.      *
  94.      * $lifetime === false resets lifetime to session.gc_maxlifetime
  95.      *
  96.      * @param int $lifetime
  97.      * @param boolean $overrideLifetime (optional)
  98.      * @return Zend_Session_SaveHandler_Memcached
  99.      */
  100.     public function setLifetime($lifetime, $overrideLifetime = null)
  101.     {
  102.         if ($lifetime < 0) {
  103.             /**
  104.              * @see Zend_Session_SaveHandler_Exception
  105.              */
  106.             require_once 'Zend/Session/SaveHandler/Exception.php';
  107.             throw new Zend_Session_SaveHandler_Exception();
  108.         } else if (empty($lifetime)) {
  109.             $this->_lifetime = (int) ini_get('session.gc_maxlifetime');
  110.         } else {
  111.             $this->_lifetime = (int) $lifetime;
  112.         }
  113.  
  114.         if ($overrideLifetime != null) {
  115.             $this->setOverrideLifetime($overrideLifetime);
  116.         }
  117.  
  118.         return $this;
  119.     }
  120.     /**
  121.      * Retrieve session lifetime
  122.      *
  123.      * @return int
  124.      */
  125.     public function getLifetime()
  126.     {
  127.         return $this->_lifetime;
  128.     }
  129.     /**
  130.      * Set whether or not the lifetime of an existing session should be overridden
  131.      *
  132.      * @param boolean $overrideLifetime
  133.      * @return Zend_Session_SaveHandler_Memcached
  134.      */
  135.     public function setOverrideLifetime($overrideLifetime)
  136.     {
  137.         $this->_overrideLifetime = (boolean) $overrideLifetime;
  138.  
  139.         return $this;
  140.     }
  141.  
  142.     public function getOverrideLifetime()
  143.     {
  144.         return $this->_overrideLifetime;
  145.     }
  146.     /**
  147.      * Retrieve session lifetime considering
  148.      *
  149.      * @param array $value
  150.      * @return int
  151.      */
  152.     public function open($save_path, $name)
  153.     {
  154.         $this->_sessionSavePath = $save_path;
  155.         $this->_sessionName     = $name;
  156.  
  157.         return true;
  158.     }
  159.     /**
  160.      * Retrieve session expiration time
  161.      *
  162.      * @param * @param array $value
  163.      * @return int
  164.      */
  165.     public function close()
  166.     {
  167.         return true;
  168.     }
  169.  
  170.     public function read($id)
  171.     {
  172.         $return = '';
  173.  
  174.         $value = $this->_memcached->get($id);                        //获取数据
  175.  
  176.         if ($value) {
  177.             if ($this->_getExpirationTime($value) > time()) {
  178.                 $return = $value['data'];
  179.             } else {
  180.                 $this->destroy($id);
  181.             }
  182.         }
  183.  
  184.         return $return;
  185.     }
  186.  
  187.     public function write($id, $data)
  188.     {
  189.         $return = false;
  190.                      
  191.         $insertDate = array('modified' => time(),
  192.                               'data'     => (string) $data);
  193.                              
  194.            $value = $this->_memcached->get($id);                        //获取数据
  195.  
  196.         if ($value) {
  197.             $insertDate['lifetime'] = $this->_getLifetime($value);
  198.            
  199.             if ($this->_memcached->replace($id,$insertDate)) {
  200.                 $return = true;
  201.             }
  202.         } else {
  203.             $insertDate['lifetime'] = $this->_lifetime;
  204.  
  205.             if ($this->_memcached->add($id, $insertDate,false,$this->_lifetime)) {
  206.                 $return = true;
  207.             }
  208.         }
  209.        
  210.         return $return;
  211.     }
  212.  
  213.     public function destroy($id)
  214.     {
  215.         $return = false;
  216.  
  217.         if ($this->_memcached->delete($id)) {
  218.             $return = true;
  219.         }
  220.  
  221.         return $return;
  222.     }
  223.  
  224.     public function gc($maxlifetime)
  225.     {
  226.         return true;
  227.     }
  228.  
  229.     protected function _getLifetime($value)
  230.     {
  231.         $return = $this->_lifetime;
  232.  
  233.         if (!$this->_overrideLifetime) {
  234.             $return = (int) $value['lifetime'];
  235.         }
  236.  
  237.         return $return;
  238.     }
  239.  
  240.     protected function _getExpirationTime($value)
  241.     {
  242.         return (int) $value['modified'] + $this->_getLifetime($value);
  243.     }      
  244. }
  245.  
  246. 配置(可以添加多台memcache服务器,做分布式):
  247. $config = array(
  248.     'memcached'=> array(
  249.         array(
  250.             'host'=>'192.168.0.1',
  251.             'port'=>11211
  252.         )
  253.     ),
  254.     'lifetime' =>123334
  255. );
  256. //create your Zend_Session_SaveHandler_DbTable and
  257. //set the save handler for Zend_Session
  258. Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_Memcached($config));
  259. //start your session!
  260. Zend_Session::start();
原文地址 http://hi.baidu.com/billdkj/blog/item/049d04f0b2a896c47831aa1c.html

php excel 操作类 整理


23 6月
php-excel-reader是目前我所知的最好的php读取excel数据的开源类,可以做到读取带各种格式的excel文件。详见文档。 另写入类:php-excel备用(尚未使用过,不知效果如何)。 在读写excel 2003前的版本的xls文件上,曾经一度使用一个excel_class.php,但长年缺少维护感觉有点太老了,而且不太符合php5的面向对象的感觉。故弃用。 对于excel2007的文档的读写,可用PHPExcel,同样暂时还没机会使用过。但似乎此开源项目维护得不错,暂做记录。

貓熊寶寶幼齒園

姜經緯的博客