Apr 09

Zend Framework的各个模块大多能单独使用, 抽取出来的最简单的缓存模块Zend_Cache只有8个文件, 包括目录目录一个11个, 如下:

Zend/
Zend/Cache
Zend/Cache/Backend
Zend/Cache/Backend/ExtendedInterface.php
Zend/Cache/Backend/File.php
Zend/Cache/Backend/Interface.php
Zend/Cache/Backend.php
Zend/Cache/Core.php
Zend/Cache/Exception.php
Zend/Cache.php
Zend/Exception.php

我曾经看过不少PHP开发者向人推销自己的PHP框架, 其中一般都包含他们最引以为豪的的文件缓存方案. 不过, 真正通用和流行的PHP缓存方案没有几个. Zend_Cache是非常简单的, 除了可以使用文件缓存, 还可以使用闻名遐尔的memcached, 也仅仅是往上面的列表中加入一个文件Memcached.php. 文件缓存的应用限制还是很大, 因为磁盘IO很容易成为瓶颈, 高并发的时候, 还是使用memcached.

Zend_Cache的主要接口是load()和save(), 使用方法见以前的文章: Zend Framework 的缓存模块 Zend_Cache 使用(http://www.ideawu.net/blog/archives/320.html)

在IT牛人博客聚合网站(www.udpwork.com)的RSS抓取程序中, 应用了Zend_Cache, 以避免过于频繁地抓取博客的RSS, 造成博客负载过重.

Written by ideawu at 2010-04-09 19:20:40 | tags:

Apr 11

缓存有几个重要的概念:

  • 数据本身
  • 数据的标识
  • 缓存生命期
  • 缓存操作接口

缓存的获取操作一般十分快速, 而数据库操作一般是昂贵的, 所以通过缓存可以提高系统的整体性能.

Zend_Cache 的使用比较简单, 它可以把数据保存到 File, Memcache, SQLite 等介质(称为后端, Backend)中. 还有前端(Frontend), 主要用来对要缓存的数据进行转换, 如序列化.

==data==>Frontend==>mediate data==>Backend==>File, Memcache, etc

使用例子:

<?php
// "load" Zend_Cache 工厂
require 'Zend/Cache.php'; 

// 选择一个前端(例如'Core', 'Output', 'Page'...)
$frontendName = 'Core';

// 选择一个后端(例如'File'或者'Sqlite'...)
$backendName = 'File';

// 为选择的前端设置一个选项数组
// 前端把要缓存的数据序列化, 这样就可以缓存数组, 对象的实例等数据.
$frontendOptions = array('automatic_serialization'=>true);

// 为选择的后端设置一个选项数组
// 缓存文件被保存在 ./cache 目录下.
$backendOptions = array('cache_dir' => './cache');

// 创建实例(当然,最后两个参数是可选的)
$cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);

// 数据的标识
$id = 'mydata';
$data = $cache->load($id);
if(!$data){
    // 缓存中没有需要的数据(缓存未命中), 所以需要从数据库或者其它地方把数据放入缓存.
    // 这里的代码是耗时和耗资源的.
    $data = query_database();
    $tags = array();
    // 缓存的生命期为 10 秒.
    $lifetime = 10;
    $cache->save($data, $id, $tags, $lifetime);
}

// 对数据进行处理.
manipulate(data);
?>

Written by ideawu at 2008-04-11 11:56:02 | tags:

Mar 19

今天我使用 Zend Framework(以下简称 ZF) 制作一个数据库操作的 Demo.

在制作 Demo 中, 我未体会到 ZF 有明确的核心思想. 我根据 ZF 的要求写了单独的一个文件(控制器), 然后创建了单独的一个模板文件(事实上是一个普通的 PHP 文件), 而且还从 Zend_Db_Table 派生了一个类(只有类的框架, 没有任何逻辑代码), 该类拥有了 CRUD 能力.

和不使用 ZF 相比, 这样做从代码量上没有任何减少, 甚至结构上没有任何改变. $_GET['id'] 变成了 $this->_request->getParam(‘id’); include(‘header.html’) 变成了 $this->reader(‘header.html’); 没有了 SQL 字符串拼接, 但是为了保存一行数据仍然需要手工创建一个关联数组.

那么 ZF 在界面层提供了什么工具? 视图文件还是普通的 PHP 脚本, 为了显示一个数组, 仍然需要写自己的

<?php foreach…{?>

<?php}?>

在 1.0.5 版本的中, 增加了使用 PHP 脚本方式生成界面的 Zend_Form 模块, 完全地将表单的验证等逻辑处理与表单的界面耦合在一个 PHP 类中. 这样做, 根本就是违反了表现与结构分离的原则, 界面开发人员无法单独的设计界面. 而分离的一个重要目标就是让界面开发人员不需要 Web 服务器就能设计界面.

由于个人的局限性, 所以我希望 ZF fans 能交流你们对 ZF 的看法.

Written by ideawu at 2008-03-19 21:19:09 | tags: