验证码图片升级

June 15th, 2008 Michael Posted in PHP / Zend, 心情 / 生活 9 Comments » 319 views

想当初6.cn用一种开放的心态看待互联网,希望大家在一种友好、整洁的环境下共同发展,也希望让用户用起来更简单方便,一直不在任何地方提供“常见”的验证码,从去年开始,频繁开始受到各种恶意的攻击和注册,于是迫不得已加入第一个版本的验证码图片,那是一个简单、易辨认的图片 PHP验证码图片

昨天6.cn的验证码被攻破,于是迫不得以,又对验证码进行了升级,这次仍然首先考虑的是用户体验,让用户更容易辨认,想想google、qq等网站的验证码,真的是大多数时间我都是靠猜的,别说机器辨认了,人都很难,这次6.cn的验证码图片加入了更多干扰元素,背景颜色和干扰的曲线都是随机产生的,但总的来说还是比较好辨认 PHP验证码第二版 (实在看不清,可以刷新页面更新)

互联网就是这样,没有什么干净的东西可以独善其身。

AddThis Social Bookmark Button

ZF 1.5x的一点变化

April 26th, 2008 Michael Posted in PHP / Zend 3 Comments » 374 views

今天把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

AddThis Social Bookmark Button

PHP6测试版发布

April 18th, 2008 Michael Posted in PHP / Zend 2 Comments » 589 views

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

AddThis Social Bookmark Button

基于libmemcached开发php的扩展模块

March 26th, 2008 Michael Posted in PHP / Zend 7 Comments » 687 views

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()接口,请有兴趣的朋友随时关注我的更新。

AddThis Social Bookmark Button

变态有趣的Zend Framework用法

December 29th, 2007 Michael Posted in PHP / Zend 16 Comments » 7,804 views

  通常,使用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会带来很多思路上的束缚 :)

AddThis Social Bookmark Button

PHP 大文件上传进度条实现

August 27th, 2007 Michael Posted in PHP / Zend 3 Comments » 5,605 views

  目前我知道的方法有两种,一种是使用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源码说明文档里面有说明
  • 代码范例:
    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 {
        
    //其他代码,比如上传表单等
    }

  uploadprogress 模块实现方法:

  • 使用PECL模块安装方法安装该模块
  • php.ini里面设置 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”
  • 代码范例:
    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 {
        
    //显示上传表单
    }
AddThis Social Bookmark Button

ZF 1.0正式版放出

July 3rd, 2007 Michael Posted in PHP / Zend 1 Comment » 11,226 views

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

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

AddThis Social Bookmark Button

解决了ZF的两个问题

June 21st, 2007 Michael Posted in PHP / Zend No Comments » 2,317 views

  之前提到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来,赞!

AddThis Social Bookmark Button

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

June 20th, 2007 Michael Posted in PHP / Zend 1 Comment » 1,658 views

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

  • 使用 $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()方法里面无法得到该构造函数里面进行的初始化结果,这个问题让我曾经郁闷了很久。

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

AddThis Social Bookmark Button

Zend_Search_Lucene更新Index的方法

June 11th, 2007 Michael Posted in PHP / Zend 5 Comments » 4,587 views

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

AddThis Social Bookmark Button