Archive for 六月, 2009

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,同样暂时还没机会使用过。但似乎此开源项目维护得不错,暂做记录。

tar语法


23 6月
转自:http://fed.sjps.tpc.edu.tw/phpBB2/viewtopic.php?t=96 語法: tar [-zxcvfpP] filename # tar -N 'yyyy/mm/dd' /path -zcvf target.tar.gz source 參數說明: -z :是否同時具有 gzip 的屬性。 -x :解開一個壓縮檔案的參數指令! -t :查看 tarfile 裡面的檔案! -c :建立一個壓縮檔案的參數指令 -v :壓縮的過程中顯示檔案! -f :使用檔名,請留意,在 f 之後要立即接檔名喔!不要再加參數。 -p :使用原檔案的原來屬性(屬性不會依據使用者而變) -P :可以使用絕對路徑 -N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的檔案中! --exclude FILE:在壓縮的過程中,不要將 FILE 打包! 範例: 壓縮 # tar -cvf xxx.tar /home 只將目錄整合打包成一個檔案 # tar -zcvf xxx.tar.gz /home 除了將目錄打包外,同時以 gzip 壓縮 # tar -zcvf s94_all.tar.gz /home/s94/* 將 /home/s94/ 這個目錄下的檔案全部打包並壓縮成為一個 s94_all.tar.gz 的檔案 (s94表示94學年度學生資料) # tar -zcvf fed_all_20060306.tar.gz / --exclude /mnt --exclude /proc 將根目錄的所有資料壓縮至 fed_all_20060306.tar.gz 這個檔案中,除了 /mnt 及 /proc。 fed_all_20060306.tar.gz--備份fed伺服器下所有目錄與檔案 解壓縮 # tar -xvf xxx.tar 解 tar 的封包,請注意,由於沒有 gzip (.tar 而非 .tar.gz) 的作用,所以只要使用 –xvf 即可!不需要加上 z ,否則會顯示有問題! # tar -zxvf xxx.tar.gz 這個就是有加上 gzip 的壓縮的結果!所以需要加上 –z

Memcached 安装配置 整理


23 6月
Memcached需要libevent支持,所以先下载libevent安装:
  1. ./configure --prefix=/usr/local
  2. make
  3. make install
验证安装是否成功:
  1. ls -al /usr/local/lib | grep libevent
安装memcached
  1. ./configure --with-libevent=/usr/local
  2. make
  3. make install
验证:
  1. ls -al /usr/local/bin/mem*
测试:
  1. /usr/local/bin/memecached -h
若出现类似:
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
修复:
  1. LD_DEBUG=libs memcached -v
查看memcached的libs的路径 选择其中一条做ln:
  1. ln -s /usr/lib/libevent-1.4.so.2.1.3 /usr/lib64/libevent-1.4.so.2
新手注意ln是后面连到前面,也就是说,后面那个是原本不存在的,需要连接的。 启动memcached(可在/etc/rc.local中寫入以便每次重啟后自動啟動):
  1. /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
-d选项是启动一个守护进程, -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, -u是运行Memcache的用户,我这里是root, -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200, -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口, -c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定, -P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid 如果要结束Memcache进程,执行:
  1. kill `cat /tmp/memcached.pid`
也可以启动多个守护进程,不过端口不能重复。 最后记得重启apache 附转: 安装Memcache的PHP扩展 1.在http://pecl.php.net/package/memcache 选择相应想要下载的memcache版本。 2.安装PHP的memcache扩展
tar vxzf memcache-2.2.1.tgz cd memcache-2.2.1 /usr/local/php/bin/phpize ./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir make make install
3.上述安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/
4.把php.ini中的extension_dir = “./”修改为
extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/”
5.添加一行来载入memcache扩展:extension=memcache.so Memcache环境测试: 运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始领略Memcache的魅力把!
  1. $mem = new Memcache;
  2. $mem->connect("127.0.0.1", 12000);
  3. $mem->set("key", "This is a test!", 0, 60);
  4. $val = $mem->get("key");
  5. echo $val;
安全相關: 基本通過防火墻實現,只允許特定IP地址端口進行訪問即可:
  1. iptables -I RH-Firewall-1-INPUT -p tcp -s 211.144.121.81 --dport 12000 -j ACCEPT
監視memcached使用情況: memcachephp 参考: http://www.ccvita.com/257.html http://pjluo.javaeye.com/blog/200266 P.S.  php的扩展和libevent可在Cpanel的WHM中,通过Install a RPM和Module Installers直接安装。

準備開園


22 6月
老了,記性不行了,各種東西還是用記下來的吧。

貓熊寶寶幼齒園

姜經緯的博客