• 2008-04-11

    Zend Framework 的缓存模块 Zend_Cache 使用

    Views: 24717 | No Comments

    缓存有几个重要的概念:

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

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

    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);
    ?>
    
    Posted by ideawu at 2008-04-11 11:56:02 Tags:
  • 2008-03-19

    Zend Framework 有优点在哪?

    Views: 25648 | 1 Comment

    今天我使用 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 的看法.

    Posted by ideawu at 2008-03-19 21:19:09 Tags:
  • 2008-01-26

    JavaScript 多线程

    Views: 13147 | No Comments

    暂时, 我还不知道在 Firefox 和 IE 浏览器上使用 "JavaScript 多线程" 的方法. 一些资料上说的 setTimeout 和 setTimeInterval 函数可以模拟多线程, 但事实并不是这样. 例如 setTimeout 函数, 如果你在异步执行的代码中进行阻塞, 那么整个页面也将阻塞(表现为页面无法操作, 链接无法点击等). 这说明, setTimeout 只不是在当前线程中插入要执行的代码而已, 并不像其它某些语言中的定时器.

    所谓的并发, 微观上还是串行处理, 只不过对串行处理单元进行分解, 便成了另一层次上的并发. 如果可以, 应该对要处理的事务进行分解.

    Posted by ideawu at 2008-01-26 16:34:49 Tags:
  • 2007-10-07

    所谓的重新发明轮子

    Views: 18080 | 1 Comment

    "不要重新发明轮子"是从国外IT界流传进来的一句话, 目的是告诫开发者尽量使用现有的技术和组件, 不要随意重新发明这些技术和组件. 但是, 国内的IT论坛上似乎过度使用了这种思想. 常常在论坛上看到一些人在别人通过重新发明轮子来研究某项技术时, 叫嚷着"不要发明轮子", 弄得仿佛他自己就是国外的专家的闭门弟子一样. 所以我从来没有使用过"不要重新发明轮子"这句话.

    最近, 我在看国内使用者较多的某个PHP程序时, 发现作者似乎在故意卖弄地"重新发明轮子", 所以我不得不使用"不要重新发明轮子"来指责他们.

    问题出现了某个函数的参数传递上面. 因为该函数接受近10个参数, 所以作者把只接受一个字符串作为参数, 然后自己在函数中解析这些字符串. 正如注释中写的, "本方法对传递进来的参数进行解析".

    这太愚蠢了! 无论你使用PHP解析字符串的功夫再怎么高明, 难道你比语言的编译器解析得更高效吗? 而且, 那个作者的解析明显就很拙劣. 他的解析是这样的: 输入形式为类似"a:1;b:1,2;c:1-2"之类的, 大概表示a=1, b=[1,2], c='1-2'. 很明显的一个缺点就是不支持空白字符. 事实上, 如果作者确实需要参数解析, 完全可以使用URL编码, 然后使用PHP内置的URL解码功能. 或者最合适的方法是将关联数组作为参数, 这样调用:

    f(array('a'=>1, 'b'=>array(1,2), 'c'=>'1-2'));

    不管怎么说, 该作者"重新发明轮子"发明得太笨拙了! 可能"不要重新发明轮子"的本意是, 如果你无法发明功能和原有的一样, 但是实现简单或者产品的性质更好, 那么就不要这么做. 并不是说不要重新发明功能一样的东西.

    Posted by ideawu at 2007-10-07 09:36:02
  • 2007-08-25

    Web”开发者”别把JavaScript当狗屎来吃!

    Views: 12407 | 2 Comments

    AJAX是Web2.0的最重要概念, 所以JavaScript脚本语言成了当前Web开发必不可少的技术. 可是, 有些人, 在网页中胡乱堆砌, 把好好的JavaScript当作屎来用. 一个页面竟然有二三百K的脚本代码! 所以, 这种页面不小心打开, CPU占用100%, 浏览器不死也半残. 做这种网页的所谓"开发者"到底是不是吃屎长大的! 做这种垃圾网页! 你少用点要死啊! 或者你在进入这种垃圾网页之前提示一下, 这样, 我就不会不小心进入了, 不可以吗?

    这种吃屎的人做的垃圾网页在国内最重要的代表是CSDN!

    Posted by ideawu at 2007-08-25 11:23:56
  • 2007-08-18

    fopen 函数的设计

    Views: 16834 | 2 Comments

    最近, 我要使用 PHP 的随机写文件功能, 但是, 竟然找不到. 我当时知道, PHP 的 fopen 和 C 语言中的同名函数行为差不多, 参数 w 会把原文件的内容删除, a 又只能追加. 我想当然地认为参数 r 只能是读, 即使是 r+ 也是读, 因为 r=read.

    事实上, r+ 是随机读写的功能! 我不知道这样的参数设计的原因, 但是如果按照我的思维, 我会这样设计:

    r: 只读
    w: 只写
    a: 只追加
    +: 如果不存在则创建
    

    r+ 和 wa 被禁止, 因为读操作不应该创建一个文件, 而只写和只追加在语义上有冲突.

    回到这件事上, 我的问题是太想当然, 导致看手册不小心.

    Posted by ideawu at 2007-08-18 10:11:02
|<<<141516171819202122>>>| 18/28 Pages, 163 Results.