Archive for the Category » PHP / Zend «

ZF 1.5x的一点变化

今天把Zend Framework升级到了1.5.1最新版,发现有些连接访问出错,查官方文档发现是因为Action里面的“驼峰命名”方式的改变导致。

原来的情况是这样:假如我们有个 aaaBbbController::cccDddAction这么一个东西,访问的url可以是 /aaabbb/cccddd/ 也可以是 /aaaBbb/cccDdd/
现在的情况是这样:要么把方法写成 aaabbbController::cccdddAction 统一的小写,要么url里面改成这样 /aaa.bbb/ccc.ddd/ 或者 /aaa-bbb/ccc-ddd/

我还没有来得及搞明白这样改进的好处是什么。

官方文档:
7.13.1. Migrating from 1.0.x to 1.5.0 or newer
CamelCasedNamingConventions

Category: PHP / Zend  Tags:  5 Comments

PHP6测试版发布

[转载]去年在巴黎举行的PHP开发者大会中,PHP6开发的消息开始流传开来,
于PHP大会讨论的PHP6,将有很大幅度的变化,但这只是草案阶段,
并不代表所有会议的机率都会随着PHP6的发布而包含记录中所有的变更
也就是说,在发布PHP6之前,还是会有异动的情形,但是可以确定的是
下面所列的数项变化,将会随着PHP6一同面世(当然不是百分百乐,)
赶快来看看这些新特性吧
more »

Category: PHP / Zend  4 Comments

基于libmemcached开发php的扩展模块

PHP有个pecl memcached扩展,这是大家默认的选择,对绝大多数应用来说,其实已经够用了,出于学习研究的目的,在朋友小叶的要求下,尝试了利用libmemcached模块来开发一个PHP的扩展。

对于memcached,不在这里多说了,更多的文档可以参照我另外的blog文章或者去memcached官方,在官方文档中,我们可以找到各种语言的APIs,包括已有的pecl memcached API,另外还有Ruby、Perl、C#等API,这次需要用的是C的API,据小叶说,有另外的测试证明基于C API中libmemcached写的Ruby扩展性能比基于libevant写的PHP Pecl Memcached效率高出20倍,这个真实性不去考证了,只准备测试一下用libmemcached来写另外一个PHP的扩展。

这里准备按照最常规的流程来完成这个PHP扩展的开发。目前完整的模块还未写完,只完成了一个测试接口和connect()接口,请有兴趣的朋友随时关注我的更新。

变态有趣的Zend Framework用法

  通常,使用ZF的人都对Controller很感兴趣,尤其是Rewrite和Router功能很吸引人,不过因为一些特殊原因,比如大项目中涉及大量的rewirte条件,导致全部交给php来处理有些难以接受,这个时候就可能会放弃掉ZF的Index.php文件, 而采用传统的PHP文件结构,这时的ZF如何使用呢?

  前一段时间完成的6.cn 的专辑改造 (http://6.cn/zj),完全基于了ZF来实现,但却没有使用ZF的index.php文件,在目录结构上,完全参照了ZF标准的Models、Views、Controllers模式开发,只不过调用的地方直接调用Controller里面的Action,这相当于把Controller当作了一个普通的类来使用,这个方法经过使用,发现虽然有些变态,其实还是挺有趣和挺方便的。有兴趣的朋友可以尝试一下,感觉似乎更灵活,有时index.php会带来很多思路上的束缚 🙂

PHP 大文件上传进度条实现

  目前我知道的方法有两种,一种是使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用PECL扩展模块uploadprogress实现(http://pecl.php.net/package/uploadprogress) 我这里举两个分别实现的例子供参考,更灵活的应用根据自己需要来修改。

  APC实现方法:

  • 安装APC,参照官方文档安装,可以使用PECL模块安装方法快速简捷,这里不说明
  • 配置php.ini,设置参数 apc.rfc1867=1 ,使APC支持上传进度条功能,在APC源码说明文档里面有说明
  • 代码范例:
    [coolcode lang=”php”]
    if ($_SERVER[‘REQUEST_METHOD’] == ‘POST’) { //上传请求
    $status = apc_fetch(‘upload_’ . $_POST[‘APC_UPLOAD_PROGRESS’]);
    $status[‘done’] = 1;
    echo json_encode($status); //输出给用户端页面里的ajax调用,相关文档请自己寻找
    exit;
    } elseif (isset($_GET[‘progress_key’])) { //读取上传进度
    $status = apc_fetch(‘upload_’.$_GET[‘progress_key’]);
    echo json_encode($status);
    exit;
    } else {
    //其他代码,比如上传表单等
    }
    [/coolcode]

  uploadprogress 模块实现方法:

  • 使用PECL模块安装方法安装该模块
  • php.ini里面设置 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”
  • 代码范例:
    [coolcode lang=”php”]
    if($_SERVER[‘REQUEST_METHOD’]==’POST’) {
    if (is_uploaded_file($_FILES[‘upfile’][‘tmp_name’])) {
    $upload_dir = ‘your_path/’;
    $ext = strrchr($_FILES[‘video’][‘name’], ‘.’);
    $sessid = $_POST[‘UPLOAD_IDENTIFIER’] ;
    $tmpfile = $upload_dir . $sessid;
    $sessfile = $upload_dir . $sessid .$ext;
    if (move_uploaded_file($_FILES[‘upfile’][‘tmp_name’],$tmpfile)) {
    //上传成功
    } else {
    //上传失败
    } else {
    //上传错误

    } elseif (!empty($_GET[‘sessid’])) {
    header(“Expires: Mon, 26 Jul 1997 05:00:00 GMT”);
    header(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”) . ” GMT”);
    header(“Cache-Control: no-store, no-cache, must-revalidate”);
    header(“Cache-Control: post-check=0, pre-check=0”, false);
    header(“Pragma: no-cache”);
    header(“Content-Type:text/html;charset=UTF-8”);

    $unique_id = $_GET[‘sessid’];
    $uploadvalues = uploadprogress_get_info($unique_id);

    if (is_array($uploadvalues)) {
    echo json_encode($uploadvalues);
    } else {
    //读取进度失败,另外处理逻辑
    }

    } else {
    //显示上传表单
    }
    [/coolcode]

ZF 1.0正式版放出

  期待已久的Zend Framework 1.0 正式版终于发布了,刚刚从SVN里面更新的版本是非常巧合的5555,从changelog来看,变化不大,早些时候在1.0 RC版本里面编写的项目基本没有任何改动就可以继续正常运行,相信在未来的版本发布过程中,向前的兼容会做到更好,在0.9.x版之后,ZF团队就一直在努力的提高ZF在未来的向前兼容能力,作为优秀的产品,这是非常重要的。

  近期有很多基于ZF的项目要启动,1.0正式版的发布对项目的开发提供了更多的保障。

Category: PHP / Zend  One Comment

解决了ZF的两个问题

  之前提到Zend Framework的三个问题,有两个问题今天晚上搞明白了。

  • ErrorController官方文档里面提到的_getRequest(‘error_handler’)方法不存在的问题,改成 $this->_getParam(‘error_handler’)即可解决。
  • Controller里面的init()方法会在基类的构造函数__construct()之前调用的问题,通过阅读 Zend_Controller_Action类里面的100-130行找到解决办法,就是在基类的__construct()里面,把 parent::__construct($request, $response, $invokeArgs); 移到初始化操作之后,比如__construct()的最后一行即可解决。

  第三个关于 useDefaultControllerAlways 参数导致_forward()方法的controller参数失效的问题不是太紧急,回头再研究。

  顺便提一下,ZF的Router功能实在太强大了,甚至支持正则匹配,完全可以写出任何你想要的灵活的URL来,赞!

最近使用Zend Framework遇到的一些问题

  目前遇到的困惑有这样一些:

  • 使用 $front->setParam(’useDefaultControllerAlways’, true) 后,会导致各个controller里面$this->_forward()方法的controller参数失效,从实际应用中,这种逻辑不合理。
  • ErrorController按照官方文档会出现$this->_getRequest()方法不存在的错误。 ErrorController::_getRequest() does not exist and was not trapped in __call()
  • 如果继承Zend_Controller_Action抽象类并实现一个自己的Controller基础类,然后每个controller都去继承或者实现这个基类,目的是可以在基础类里面进行一些各个controller里面都会需要的初始化操作,此时会出现一个问题,在访问各个Controller里面的action时,会先调用controller里面的init()方法,然后再去执行基类里面的__contruct()构造函数,这会导致init()方法里面无法得到该构造函数里面进行的初始化结果,这个问题让我曾经郁闷了很久。

  继续研究中,也希望有朋友分享经验。

Category: PHP / Zend  2 Comments

Zend_Search_Lucene更新Index的方法

  在使用Zend Framework的Search_Lucene模块时,假设你有个文档已经加入到索引里面了,而这个文档后来被删除或者被修改了,需要及时更新索引才能保证数据的时效性,以前比较傻的办法就是全部重新创建一次索引,这个开销很大,也不适合大型应用,典型的场景就是论坛的帖子,如果帖子被删除或者修改了,就需要即使更新索引。
more »

Category: PHP / Zend  11 Comments

Zend Framework 1.0.0 Release Candidate

  今天凌晨2点关机的时候还看到是0.9.3,早上起来开机发现就是1.0RC版本发布了,令人兴奋!

  May 28, 2007
  This is the final stretch. Zend Framework has come a long way, and evolved into a professional PHP class library that is already used to run many web sites around the world. This Release Candidate gets us even closer to the stable release that everyone has waited for.

  Some noteworthy improvements in this release, include:

  Zend_Filter_Input, a “cage” for validating input data
  Zend_Validate supports user-definable error messages
  Zend_Gdata redesigned interface allows a convenient object-oriented usage
  MVC ViewRenderer makes it much simpler to write controller actions

  Download Zend Framework 1.0.0 Release Candidate!

  The changelog lists changes to the Zend Framework.

Category: PHP / Zend  3 Comments