since.2006  

像Discuz!,phpwind等论坛页面下方都有统计页面SQL查询次数的功能,这个blog数据库访问层使用的是adodb,让我们来为它添加一个相应的统计功能。(现在首页上的统计功能就是用这个实现的)

adodb以OOP思想来写的,都已经封装好了,所以修改起来比较简单。
所有的查询方法(比如Execute,GetOne,GetRow等)最终都是调用特定数据库实现类的_query方法执行的。
在这个地方动下手脚就可以实现这个功能了。

设一变量,初始化为0,每次调用便加1。以mysql实现adodb-mysql.inc.php为例

//    
// 连接数据库,使用的方法和原来都一样   
// 在要显示数据库查询次数的地方:   
// echo $adodb->getQueryTimes();   
//    
class ADODB_mysql extends ADOConnection {   
    // 添加一成员变量,记录数据库查询次数   
    var $queryTimes = 0;   
   
    // 修改原有_query方法   
    function _query($sql, $inputarr) {   
   
        $this->queryTimes++;   
   
        // ...   
    }   
   
    // 添加取查询次数的方法   
    function getQueryTimes() {   
        return $this->queryTimes++;   
    }   
} 



 

Posted by hee at 13:04 PM | Permalink | 评论(0)

如果您觉得PHP能像JAVA、Visual Studio等IDE一样进行代码调试很重要,就继续往下看。

半年前的“eclipse+pdt+xdebug PHP集成开发环境”是上次重装系统时,方便自己下次重装系统时快速搭建PHP集成开发环境时记录的。

现在看来,似乎没起到一点方便的作用。反而成了目前日志中浏览量最高的一篇日志了,但内容却极其简单。

现在又准备重装系统了,再为了方便下次重装,详细的记录一下。

在上一篇文章中PDT有一点小问题,在调试时显示Variables时有问题。

现在PDT1.0.2已经Release了,刚简单的试了下,上述问题已经修正,语法提示功能也有增强。

为了方便重装系统时尽量做最小的改动,选择了XAMPP解压缩版(重装后,只需运行一次setup_xampp.bat即可),现在最新版是1.6.6

下面记下安装及设置调试过程:

软件

  • XAMPP 1.6.6 解压缩版,下载地址:点击这里
  • PDT 1.0.2 Release All-in-One,下载地址:点击这里
  • XDebug 2.0.2 | Windows modules PHP 5.2.1-5.2.7,下载地址:点击这里

注意xdebug的版本必须和XAMPP中的PHP版本兼容,XAMPP 1.6.6中PHP版本是5.2.5,所以使用XDebug 2.0.2 | Windows modules PHP 5.2.1-5.2.7

安装:

阅读全文 "Eclipse/PDT xdebug 调试PHP" »

Posted by hee at 20:02 PM | Permalink | 评论(2)

上一篇日志中有点小错误,以为del.icio.us是通过BloggerAPI来发送最新的网页收藏,经过测试其实是用MetaWeblog API来实现的。

现在很多本地博客客户端程序远程提交日志一般都是用BloggerAPI, MetaWeblog API来实现的,只不过他们实现了整个相关接口。我们来实现一个最简单的接收功能。:)

相关资源
XML-RPC for PHP: http://phpxmlrpc.sourceforge.net
MetaWeblog API: http://www.xmlrpc.com/metaWeblogApi
RSS2.0: http://blogs.law.harvard.edu/tech/rss

先用xml-rpc for php实现一个xml-rpc服务端:

  1. // 创建一个xml-rpc服务   
  2. // del.icio.us发送链接时会调用metaWeblog.newPost方法   
  3. // 而我们的程序收到消息后,又将调用我们定义的newPost方法   
  4. // 所以我们可以在newPost方法中做自己想做的事情   
  5. $s = new xmlrpc_server(array(   
  6.                 'metaWeblog.newPost' => array(   
  7.                 'function' => 'newPost'  
  8.                 // 这里还可以定义其它参数,参数类型,方法描述等   
  9.                 // 不要使用参数类型,del.icio.us发送的数据和MetaWeblog API中不一致   
  10.                 // 规范中第一个参数是string类型,而del.icio.us发送的是int类型 ?   
  11.                 )   
  12.             ));   
  13.   
  14. // 参数$m是xml-rpc for php中的xmlrpcmsg类型   
  15. function newPost($m) {   
  16.     global $xmlrpcerruser;   
  17.        
  18.     $n = php_xmlrpc_decode($m);   
  19.        
  20.     $blogid = $n[0];       
  21.     $username = $n[1];  // 用户名   
  22.     $password = $n[2];  // 密码   
  23.     $struct = $n[3];    // 数组类型   
  24.     $publish = $n[4];      
  25.   
  26.     $title = $struct['title'];  // 标题   
  27.     $content = $struct['description'];  // 内容   
  28.   
  29.     // 有了上述值后,就随你操作了   
  30.     // 验证用户是否合法   
  31.     // 插入数据   
  32.   
  33.     if ($failure) {   
  34.         // 失败返回这个   
  35.         return new xmlrpcresp(0, $xmlrpcerruser"failure");   
  36.     } else {   
  37.         // 成功返回这个,$uuid是生成的日志id   
  38.         return new xmlrpcresp(new xmlrpcval("$uuid""string"));   
  39.     }   
  40. }  

然后进入del.icio.us -> settings -> daily blog posting -> add a new thingy 中设置xml-rpc服务端地址、用户名、密码等。

上述代码就可以完成接收del.icio.us最新收藏的功能。应该再过几十分钟del.icio.us就会发送一篇收藏到这个日志中来。
如果没有,就是我人品有问题了。

 

Posted by hee at 16:08 PM | Permalink | 评论(0)

最后更新: 2008-02-12 此日志有更新版本:http://www.ajaxeye.com/blog/54/

其实zend studio上面的功能都有,debug功能又很方便。
但是有时写写js或xml等,那些代码提示什么的都没了。而eclipse下插件几乎涵盖了各方面,php可以用pdt、js可以用aptana、xml可以用xmlbuddy等等。

eclipse+pdt安装很简单,官网上有all-in-one下载,但要加上debug功能就比较反繁琐。照着参照步骤一步一来还是没有问题的。
安装的时候一定要注意版本对应的问题,偶装的是apache2.2.4, php5.2.1, php_xdebug.dll(for php5.2.1)

apache安装
直接下一步,下一步就OK,测试时看到It works!说明安装成功

php安装
参考http://www.php.net/manual/zh/install.windows.apache2.php
安装好后写个phpinfo文件测试下

eclipse+pdt安装(需先安装jre)
http://download.eclipse.org/tools/pdt/downloads
下载S20070401-RC3 all-in-one
最新的S20070611-M1 all-in-one最终安装好后,调试时显示Variables时有问题

xdebug安装
https://bugs.eclipse.org/bugs/show_bug.cgi?id=169408
下载Prebuilt Binary of XDebug Support V0.2.2 for PDT RC3 only
在上面这个附件中有pdt xdebug插件及XDebugGuide.pdf
参照XDebugGuide.pdf中内容安装(精华就在这里) :)

安装详细步骤没有写下来,上面的链接中文章都说的非常清楚了
有什么问题留言,呵呵

 

Posted by hee at 20:06 PM | Permalink | 评论(0)

(一)中讲到了wordpress是如何读取系统中所有插件的。

现在我们来看看她是如何激活及停用插件的。

激活及停用插件

wordpress的当前使用的插件列表存放在数据库中,wp_options表,字段option_name值为active_plugins的列存放的就是当前系统中使用的插件。
a:2:{i:0;s:9:"hello.php";i:1;s:16:"wp-db-backup.php";}
就是当前系统中使用的两个插件Hello Dolly、WordPress Database Backup。
这个字段原有类型是array,经过serialize后存放在数据库中,读出时unserialize。

取得当前系统中使用的插件 functions.php | 273行 | function get_settings($setting) {}

  1.     // 这个方法是通用方法,不光是用来读取当前使用插件   
  2.     // 当 $setting = active_plugins 时读取当前使用的插件   
  3.     $row = $wpdb->get_row("SELECT option_value FROM $wpdb->options WHERE option_name = '$setting' LIMIT 1");   
  4.        
  5.     // ......   
  6.   
  7.     ifis_object$row) ) {   
  8.         $value = $row->option_value;   
  9.         // 存入缓存中,下次直接从缓存中取值不用再查询数据库   
  10.         wp_cache_set($setting$value'options');   
  11.     }   
  12.        
  13.     // 对于active_plugins,只是将值unserialize返回   
  14.     return apply_filters( 'option_' . $setting, maybe_unserialize($value) );   
  15.        
  16.     // unserialize前的值   
  17.     // a:2:{i:0;s:9:"hello.php";i:1;s:16:"wp-db-backup.php";}   
  18.   
  19.     // unserialize后的值   
  20.     /*  
  21.     Array  
  22.     (  
  23.         [0] => hello.php  
  24.         [1] => wp-db-backup.php  
  25.     )  
  26.     */  

激活插件

通过链接plugins.php?action=activate&plugin=hello.php
wp-admin/plugins.php | 5行左右 |

  1. // 取得当前系统中使用的插件   
  2. $current = get_settings('active_plugins');   
  3. // 待激活插件不在已激活插件列表中   
  4. if (!in_array($_GET['plugin'], $current)) {   
  5.     // 将新插件添加到已激活插件列表中   
  6.     $current[] = trim( $_GET['plugin'] );   
  7.     sort($current);   
  8.     // 将当前正在使用的插件存放到数据库中   
  9.     // 对于active_plugins,只是将当前使用的插件列表serialize后存放进数据库   
  10.     update_option('active_plugins'$current);   
  11.        
  12.     // ......   
  13. }  

停用插件

通过链接plugins.php?action=deactivate&plugin=hello.php
wp-admin/plugins.php | 16行左右 |

  1. // 取得当前系统中使用的插件   
  2. $current = get_settings('active_plugins');   
  3. // 先搜索待停用插件在使用插件中的位置,再将插件列表这部分内容去掉   
  4. array_splice($currentarray_search$_GET['plugin'], $current), 1 );   
  5. // 将删除待停用过后的插件列表存放到数据库中   
  6. // 对于active_plugins,只是将当前使用的插件列表serialize后存放进数据库   
  7. update_option('active_plugins'$current);   
  8.   
  9. // ......  
Posted by hee at 12:04 PM | Permalink | 评论(0)

wordpress目前非常流行一款开放源代码基于php,mysql的blog系统,尤其是她的插件机制更让人着迷。有很多wordpress插件的相关网站。
让我们来一起剖析她的插件机制的实现吧。

wordpress是怎么读取当前所有插件的?
wordpress的插件存放在wp-content\plugins目录下,可以直接存放在plugins或plugins的二级目录下。
登录后台进入Plugins栏目可以查看当前所有存在的插件相关信息。

以Hello Dolly插件为例。

wp的插件相关描述存放在php文件内容开始的地方

  1. /*  
  2. Plugin Name: Hello Dolly  
  3. Plugin URI: http://wordpress.org/  
  4. Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <CITE>Hello, Dolly</CITE> in the upper right of your admin screen on every page.  
  5. Author: Matt Mullenweg  
  6. Version: 1.5  
  7. Author URI: http://photomatt.net/  
  8. */   
读取当前系统中插件文件夹中的文件 admin-functions.php | 1516行 | function get_plugins() {}
  1. // Files in wp-content/plugins directory   
  2.     // 读取系统插件目录中所有文件及文件夹   
  3.     $plugins_dir = @ dir($plugin_root);   
  4.     if ($plugins_dir) {   
  5.         while (($file = $plugins_dir->read()) !== false) {   
  6.             // 跳过当前目录 . 和上级目录 ..   
  7.             if (preg_match('|^\.+$|'$file))   
  8.                 continue;   
  9.             // 如果当前句柄是目录,再循环读取当前目录下所有.php的文件   
  10.             if (is_dir($plugin_root.'/'.$file)) {   
  11.                 $plugins_subdir = @ dir($plugin_root.'/'.$file);   
  12.                 if ($plugins_subdir) {   
  13.                     while (($subfile = $plugins_subdir->read()) !== false) {   
  14.                         // 跳过当前目录 . 和上级目录 ..   
  15.                         if (preg_match('|^\.+$|'$subfile))   
  16.                             continue;   
  17.                         // 如果是php文件则保存到$plugins_files数组中   
  18.                         if (preg_match('|\.php$|'$subfile))   
  19.                             $plugin_files[] = "$file/$subfile";   
  20.                     }   
  21.                 }   
  22.             } else {   
  23.                 // 如果是php文件则保存到$plugins_files数组中   
  24.                 if (preg_match('|\.php$|'$file))   
  25.                     $plugin_files[] = $file;   
  26.             }   
  27.         }   
  28.     }   
  29.        
  30.     foreach ($plugin_files as $plugin_file) {   
  31.         if ( !is_readable("$plugin_root/$plugin_file"))   
  32.             continue;   
  33.            
  34.         // 读取每个插件的相关描述信息,见下   
  35.         $plugin_data = get_plugin_data("$plugin_root/$plugin_file");   
  36.   
  37.         if (emptyempty ($plugin_data['Name'])) {   
  38.             continue;   
  39.         }   
  40.   
  41.         $wp_plugins[plugin_basename($plugin_file)] = $plugin_data;   
  42.     }   
  43.        
  44.     // ......   
  45.        
  46.     // 所有插件相关描述信息就保存在这个数组里了   
  47.     return $wp_plugins;  
分析每个插件的相关描述信息 admin-functions.php | 1486行 | function get_plugin_data($plugin_file) {}
  1. // 将每个php文件中内容读取到$plugin_data中,PHP4.3.0开始可用file_get_contents()来将文件读入到一个字符串返回。   
  2.     $plugin_data = implode('', file($plugin_file));   
  3.     // 用正则读出每个插件的名称、URL、描述、作者、版本等信息   
  4.     preg_match("|Plugin Name:(.*)|i"$plugin_data$plugin_name);   
  5.     preg_match("|Plugin URI:(.*)|i"$plugin_data$plugin_uri);   
  6.     preg_match("|Description:(.*)|i"$plugin_data$description);   
  7.     preg_match("|Author:(.*)|i"$plugin_data$author_name);   
  8.     preg_match("|Author URI:(.*)|i"$plugin_data$author_uri);   
  9.     if (preg_match("|Version:(.*)|i"$plugin_data$version))   
  10.         $version = trim($version[1]);   
  11.     else  
  12.         $version = '';   
  13.        
  14.     // ......   
  15.        
  16.     return array ('Name' => $name'Title' => $plugin'Description' => $description'Author' => $author'Version' => $version'Template' => $template[1]);  

wp-admin/plugins.php 调用 get_plugins() {} 方法显示所有插件,读取完毕。

 

Posted by hee at 21:03 PM | Permalink | 评论(0)