BSD下Pecl报告undefined function preg_match()错误处理

March 14th, 2009 Michael Posted in PHP / Zend 3 Comments » 10 views

默认情况下,BSD的ports安装的PECL命令,会出现错误:
# pecl
Fatal error: Call to undefined function preg_match() in …

问题的原因是出在 /usr/local/bin/pecl 的最后一行:

exec $PHP -C -n -q $INCARG -d output_buffering=1 -d safe_mode=0 …

这行代码里面的 -n 参数表示不加载PHP的配置文件 php.ini ,因此 pcre.so 就不会被加载而导致错误,
,你只要改一下这行代码,去掉 -n 参数即可搞定。

AddThis Social Bookmark Button

三道PHP面试题

August 27th, 2008 Michael Posted in PHP / Zend 19 Comments » 960 views

有三道PHP的面试题,除了第三题需要一些经验和对HTTP协议理解外,前面两题其实很简单,但是很少遇到有人答正确的,大部分人我想都不是技术问题,而是思考是否严谨的问题。

1. 下面语句输出什么?为什么?
if ($a=$b)  printf(“a==b”);
else  printf(“a!=b”);
2. $array[‘anykey’]和$array[anykey]有什么区别?
3. 写出使用telnet命令通过GET的方式访问http://www.toplee.com/index.php 得到页面返回的方法(不是用PHP实现,用dos或者unix命令行实现)。
AddThis Social Bookmark Button

验证码图片升级

June 15th, 2008 Michael Posted in PHP / Zend, 心情 / 生活 10 Comments » 680 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 5 Comments » 602 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 3 Comments » 774 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 8 Comments » 1,022 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 » 8,130 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 11 Comments » 6,086 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,330 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,444 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