易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
张宴:当MySQL 和 Memcached 遇到尾部空格时

张宴:当MySQL 和 Memcached 遇到尾部空格时

张宴遇到的问题,我没有遇到过,只是以前知道,mysql在varchar类型插入的时候,会把字符串末尾的空格取消的(难道我记错了?),char的没记。不过按照char的类型,他是会用空格补全长度。所以,即使没空格也会多出空格。但,用PHP取出来后,我就没有注意过了。。。

下面是张宴遇到的问题,不过我觉得还是有必要用PHP实现一下看看究竟怎么回事。。。

同事下午遇到一问题,MySQL 和 Memcached 对于同一个key,不能对应起来。最终原因是:PHP将key写入MySQL数据库之前,没有经过trim()过滤首尾空格(关键是尾部空格),结果:

1、MySQL的varchar、char类型字段,SELECT .... WHERE 查询时忽略字段的尾部空格。例如varchar类型字段uidcode中,存储的含有尾部空格的内容“rewinx ”,通过以下三种方式均可查询到:

yii-1.1.0-validator-cheatsheet.pdf

在MySQL手册第“11.4.1. CHAR和VARCHAR类型”节中写道(http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char): 请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有 MySQL版本均如此,并且它不受SQL服务器模式的影响。

   2、PHP 的 Memcache 扩展,则在set、get时,自动将key中的空格,转换成了半角下划线“_”。当然,直接通过 Memcached 协议来读取,key值“rewinx ”就要写成“rewinx_”了。

示 例:testmc.php

<?php
$memcache_obj = new Memcache;
$memcache_obj->connect('192.168.8.34', 11211);
$memcache_obj->set('rewinx ', 'hello world');
echo $memcache_obj->get('rewinx ')."\r\n";
?>

ea584e9476ca45c609c405ed46780362

四季网

四季网

一大早小茗就在QQ上告诉我他的四季网终于开始折腾并部分上线了。兴冲冲的走过去一看,原来他的四季网目前就提供了手机软件下载。

略微瞅了一下,内容还并不是太多,不过已经有点框架在了,主要还是针对一些智能机了(旁白:废话,不是智能机有必要下载手机软件吗)。默认是HTC品牌,难道是想乘着HTC最近高调进入国内而开始主打这个分类?

不过据我知道的,小茗的手机本身也就是HTC的,当然,我的也是。只是他是WM系统而我是android系统。

正因为我是HTC android的系统,找到左边的G2分类,看了看软件,嗯。还是有一些值得看看的,平时不太注意,但有可能有用的软件上面还是不少【虽然market上有分类,但毕竟不象下载站那些会分的很细】

点开每个软件的页面,还是比较简陋。不过小茗也说了最近公司在忙,忙完这段时间就开始折腾页面了。对于一个专业人士来说,做点页面当然不是问题。。

最后看了一下博客,本以为他会把最新更新和想法之类的写在博客里。却看到了typecho这个。用的是m4的模版。额,大吃一惊。

不管怎么样,还是希望小茗这个暂时只有手机软件下载的四季网能够发展起来吧。要知道如今有想法想做一个站的人已经是越来越多,但真正能够成功的却廖廖无已了。

jQuery EasyUI Demo 修正

jQuery EasyUI Demo 修正

对秀才的demo做了点简单的修正。
1、index.html中的
var _menus = { menu object };
改为
var _menus = [{xx}];
这样的好处是,如果json是生成而来的也不受影响

2、修改outlook.js
在 InitLeftMenu()方法 增加一个判断:
if( typeof _menus[0] != 'object'){
alert('左侧菜单加载失败,请检查菜单数据来源');
return ;
}
搜索 _menus,改为_menus[0]

--------------------------
理由,因为大多数时间菜单是用程序生成的。如果不用[]包住就可能会出现
var _menus = ;
function test(){}
这样,语法是错误的。用[]进行一下容错。
-------------------------
demo也不错,提供下载,但我在这个压缩包里没有进行修正【请需要的朋友自己修正吧】
作者:疯狂秀才
网站:http://hxling.cnblogs.com
Demo:4578cadd56e3069229953180fabc2c5b

黄征 - 卖

黄征 - 卖

这首歌是在群里面的群友发出来的链接,看了一下,确实不错。
而且MTV拍的也不错,所以发上来与各位分享一下。。。

看完后别哭,foxcon不欢迎你。

TIPS:利用rewrite来规避注入漏洞

TIPS:利用rewrite来规避注入漏洞

PHP的新手在开发的时候不可避免的会遇到SQL注入的问题,很多老手在介绍的时候是叮嘱叮嘱再叮嘱啊。其实有个简单的方法就可以减少这种问题的过失。
1、rewrite 规则
2、很多框架的路由
这两种方式都是将GET方法做了一个简单正则处理,也只有符合规则的情况下,GET值才会被赋值到变量中。如果将ID等做一个\d的判断,那么非数字的已经经过一次过滤了。
而且,你在采用rewrite规则的时候,很多sql语句就无法通过URL被传递进来,因为他们不能被正则正常解析。
当然,你也可以想象,如果你的URL是1-0-0-1-0-1-0-1-1-1.html你能知道这些位数是干嘛的不?这种情况用于搜索比较常见,因为搜索的条件会比较复杂,也会比较容易被用来做注入。
如果根据ID取文章之类的,你show-1-1.html别人是知道你的ID为多少,但已经不太容易注入了吧?
新手只是要学习一下rewrite规则了。了解一下正则也好HOHO

两篇PHP的文章不错

两篇PHP的文章不错

可以值得一看的文章 :
PHP三层结构(上)——简单三层结构
PHP三层结构(下)——PHP实现AOP

摘要: 本文重点讨论 PHP 三层结构代码中的中间层,由于需求不断增加造成中间层代码越来越庞大,最终导致代码难以维护。在论述过程中提出对中间层建立扩展机制,并引出 AOP——面向切面的编程概念。本文提供 PHP 源码!

在PHP方面已经挺不错了。

其实 在QEEPHP中,已经有实现了。不过没有想象中的那么好。

在第二篇 的文章中,我想过如何用插件来实现这些高级效果?那后来添加的插件又怎么实时加入系统?

QEEPHP和thinkPHP在后来已经有beforeAction,afterACtion。

thinkPHP在最早的model里也有beforeInsert,afterInsert之类的功能,用来处理数据验证。这其实已经有上面介绍的原型功能了。

过多的面向对象,虽然损失的效率,但对于业务逻辑处理来说,却比较方便了。

挫,godaddy清空购物车

挫,godaddy清空购物车

说起来郁闷,godaddy的购物车我真的不知道怎么清空,以至于我刚买的qqapi.com被强制续费了一年,虽然钱没多少,但是不爽啊。
最近又想注册一个域名,可是发现购物车里不知何时又多了一个域名。一下子愣在那里了,于是去google搜索了一下“清空godaddy购物车”,还真的发现了不少与我有同样问题的朋友。
原来,godaddy的购物车清空是在提交订单页面的,首页的购物车弹出窗中没有remove了(记得最早的时候有remove,后来不知道怎么就没有了)。
在提交订单页的表单右下角,居然有一个链接“Empty Cart”。激动啊。终于可以清空godaddy的购物车了。
看来,我还是不够细心,不过从这里我也感觉godaddy是不是有什么想法?这样明显没有用户体验的功能也放在网上,真想不通?难道是逼着你买?
在国内,用户体验越来越被提上日程,连老王也写了表单的用户体验改进的文章:增加表单可用性之提示文字,为什么老外却越来越忽视呢?

顺便,大量更新了godaddy的优惠码,都是7.49左右的。好象现在没有比这个更低的了,以前我是有过对折的。。链接在:godaddy优惠码

PHP的面试题

PHP的面试题

求职的朋友可以看看,不过也不要想着这些就一定有用,有时候工作中的经验也是非常重要的。不过,基本知识点还是非常重要的。至于高阶中的算法问题,如果你不是做特别重要的任务,这些算法你是碰不到的(做网游的除外);高阶中的像册处理,如果你真能处理好了,你单独做一个产品出售也不成问题啊。

1. 基本知识点

  1. HTTP协议中几个状态码的含义:503 500 401 200 301 302。。。
  2. Include require include_once require_once 的区别.
  3. PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。
  4. HEREDOC介绍
  5. 写出一些php魔幻方法;
  6. 一些编译php时的configure 参数
  7. 向php传入参数的两种方法。
  8. (mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
  9. error_reporting 等调试函数使用
  10. 您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?
  11. posix和perl标准的正则表达式区别;
  12. Safe_mode 打开后哪些地方受限.
  13. 写代码来解决多进程/线程同时读写一个文件的问题。
  14. 写一段上传文件的代码。
  15. Mysql 的存储引擎,myisam和innodb的区别。

2. web 架构,安全,项目经验

  1. 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。
  2. 使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite.
  3. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
  4. 写出一种排序算法(原理),并说出优化它的方法。
  5. 请简单阐述您最得意的开发之作
  6. 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
  7. 您是否用过模板引擎? 如果有您用的模板引擎的名字是?
  8. 请介绍Session的原理,大型网站中Session方面应注意什么?
  9. 测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。
  10. 正则提出一个网页中的所有链接.
  11. 介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。
  12. 您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。
  13. 大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?
  14. 相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
  15. 一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…, 如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。

3. unix/linux 基本使用

  1. linux下查看当前系统负载信息的一些方法。
  2. vim的基本快捷键。
  3. ssh 安全增强方法;密码方式和rsa key 方式的配置。
  4. rpm/apt/yum/ports 装包,查询,删除的基本命令。
  5. Makefile的基本格式,gcc 编译,连接的命令,-O0 和-O3区别。
  6. gdb,strace,valgrind的基本使用.

4. 前端,HTML,JS

  1. css盒模型。
  2. javascript中的prototype。
  3. javascript中this对象的作用域。
  4. IE和firefox事件冒泡的不同。
  5. 什么是怪异模式,标准模式,近标准模式。
  6. DTD的定义
  7. IE/firefox常用hack.
  8. firefox,IE下的前端js/css调试工具。

原文来自http://www.162cm.com/archives/972.html
前两天在面试的时候面试官就提出,数据库什么时候关闭比较好?是让他自已关闭还是主动在代码中关闭?

取消radio的选中状态

取消radio的选中状态

一个简单的例子,是懒宝宝让我帮忙的。因为我自己也注意到了,radio在选中后,一般无法取消,查了一下google,发现还是有方法 的。因此,立马解决了:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<table class="rs" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>HIV :阴
<input type="radio" name="hiv[0]" value="HIV:阴" union="yin"/>
阳
<input type="radio" name="hiv[0]" value="HIV:阳" union="yang" /></td>
<td>梅毒:阴
<input type="radio" name="hiv[1]" value="梅毒:阴" union="yin" />
阳
<input type="radio" name="hiv[1]" value="梅毒:阳" union="yang" /></td>
<td>疱疹:阴
<input type="radio" name="hiv[2]" value="疱疹:阴" union="yin" />
阳
<input type="radio" name="hiv[2]" value="疱疹:阳" union="yang" /></td>
<td>淋病:阴
<input type="radio" name="hiv[3]" value="淋病:阴" union="yin" />
阳
<input type="radio" name="hiv[3]" value="淋病:阳" union="yang" /></td>
</tr>
<tr>
<td>非淋:阴
<input type="radio" name="hiv[4]" value="非淋:阴" union="yin" />
阳
<input type="radio" name="hiv[4]" value="非淋:阳" union="yang" /></td>
<td>湿疣:阴
<input type="radio" name="hiv[5]" value="湿疣:阴" union="yin" />
阳
<input type="radio" name="hiv[5]" value="湿疣:阳" union="yang" /></td>
<td>丙肝:阴
<input type="radio" name="hiv[6]" value="丙肝:阴" union="yin" />
阳
<input type="radio" name="hiv[6]" value="丙肝:阳" union="yang" /></td>
<td><a style="cursor:pointer;" id='allyin'>全阴</a> <a style="cursor:pointer;" id='allyang'>全阳</a> <a id='allempty' style="cursor:pointer;">重填</a>
<script>
$(function(){
$('#allyin').click(function(){
$(':input[union="yin"]').attr('checked','checked');
});
$('#allyang').click(function(){
$(':input[union=yang]').attr('checked','checked');
});
$('#allempty').click(function(){
$(':input[union=yang]').each(function(){
$(this).attr('checked','checked');
var tmp = $(this)[0];
tmp.checked = false;
tmp = null;
})
});
});
</script></td>
</tr>
</table>
因为用jquery的话,选中radion的方法很方便。所以,就尝试用这种方式解决了。。。但是用jquery无法取消checked状态,只能用原生js的方式才行(jquery是把元素都转换为对象,而不是DOM对象)
XHProf介绍

XHProf介绍

上次我在博客里提到xhprof是文锋的一次聚会,其中echo就提出了这个xhprof,轻量级,fackbook常用,当然echo他们用的也很多。

说实话我在之前没有了解过xhprof,大多数情况下还是用xdebug,但在线上的时候,肯定是不敢开这样耗资源的玩意。所以就对xhprof关心了一点点。再后来看了一点资料,同时echo那天也贴出了部分代码,也基本上是在用概率的方式提取LOG,或者指定某种具体条件的情况下记录,以节省资源。

今天在闲逛的时候看到有人把中文手册翻译了。感慨万分,好久没有做过这种事情了。不是我太懒,而是真的做不来。

原文在这里:http://www.162cm.com/p/xhprofdoc.html

作者这样介绍自己:

翻译:徐仁禄  <xurenlu [at] gmail.com > 
原文地址: http://mirror.facebook.net/facebook/xhprof/doc.html
初次翻译,大部分是google translate tookit工具给翻的,稍微修改了下。如遇错误,还请来信指出。谢谢!

内容如下:

目录

  1. 导言
  2. XHProf 概况
  3. 安装XHProf扩展
  4. 使用XHProf进行性 能分析
  5. 设 置XHProf用户界面
  6. 在生产环境中使用 XHProf注意事项
  7. 轻量级采样模式
  8. 附加功 能
  9. 信赖
  10. 鸣 谢
  1. 导言

    XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情 况。一个函数的开销,可细分成调用者和被调用者的开销。原始数据收集部分是用纯C实现的,是一个名叫xhprof的 Zend扩展 。XHProf有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。

    XHProf报告往往可以有助于理解被执行的代码的结构。的等级性质的报告可用来确定,例如,什么链要求导致了所谓的特殊 功能得到。

    XHProf可以比较两次运行的结果(又名“差异报告”)或是从多次运行得到的汇总数据。差异和汇总报告,就像单一运行报 告一样,也提供“平板”以及“分层”的性能分析视图。

    XHProf是一种轻量级的性能分析工具。在数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态 callgraph的一个程序。它独有的数据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用 中每个深度的调用一个有用的命名来避开死循环。

    XHProf的轻量级性质和汇聚功能,使得它非常适合用于收集“生产环境”的性能统计数据的统计。[见用于生产环境的补充 说明。 ]


    例如,XHProfLive (不属于开源的工具包),是Facebook使用的一个全系统的性能监测系统,建立在XHProf的基础之上 。 XHProfLive不断收集函数级别的Profiler资料,这些资料来自生产环境中运行中的示例页面[用xhprof来收集] 。然后XHProfLive汇总指定的时候,页面类型,来取得各个页面的性能数据,可以帮助解决各种问题,如:特定的某个网页的函数级的性能情况怎样?在 所有网页中,或者对某一具体的网页,foo 函数的开销如何?在过去的一小时/天/周中,哪些函数返回的次数最多?某个页面/函数的执行时间的变化趋势如何?等等。


    由Facebook最初开发的XHProf在2009年3月开放源代码。

  2. XHProf概况

    XHProf提供的功能:

    • 扁平的性能概要(截 图 )

      提供函数级别的性能信息,例如调用次数,其中包括/独家壁时间,内存使用情况,和CPU时间。

    • 分层剖析(父/子{0视图){/0} ( 截 图 )

      对每一个函数,它提供了一个断点,个崩溃的要求和时间每母公司(来电)和儿童(被调用) ,如:

      • 哪些函数调用了指定的函数,各自调了多少次?
      • 一个特定的函数调用了哪些函数?
      • 在被一个特定的函数调用时,某个函数一共耗去了多少时间 。
    • 差异报告

      出于各种原因,您可能需要比较从两个XHProf运行中得到的数据-找出是什么造成了从一个版本到另一个版本的退 步,或是评估您将要做的优化的性能提升。

      阿差异报告考虑两分,作为输入,并提供两个平面功能级别差异的信息,和层次信息(细目差异的父母/儿童职能)的每 个功能。

      差异报告里的“平板”视图指出了最主要的退步或改进。

      点击差异报告平板视图中的函数,进入“层次”(或父/子)视图。我们可以得到的具体的父子函数的差异。

    • Callgraph视图

      性能数据也可以通过callgraph视图来查看 。callgraph 会高亮显示程序的关键路径。

    • 内存剖析

      XHProf的内存剖析模式能有助于跟踪那些申请大量内存的函数。

      值得澄清的是,XHProfu并不严格跟踪所有分配/释放内存的操作。相反,它使用了一种简化思路。他记录了每个 函数进入和结束后的内存的增减。它还记录每个函数分配内存的峰值的变化。

    • XHProf记录include, include_once, require and require_once require_once操作,就像他们是函数一样。那些被包含文件的名字被用来产生假的函数的名字。
    • 术语表

      1. Inclusive Time (或子树执行时间) :[包括子树执行时间的所有执行时间。]
      2. Exclusive Time/Self Time :[函数执行本身的时间花费。]不包括子树执行时间。
      3. Wall时间 :又名经过的时间或挂钟时间。
      4. CPU时间 : CPU时间在用户空间+ CPU时间在内核空间
    • 特殊函数的命名约定

      1. main():一个虚构的函数,这是所有调用的根节点。
      2. load::<filename> 和 run_init::<filename>:

        XHProf 跟踪PHP的include/require操作,和跟踪函数调用一样。

        例如, include “lib/common.php"; 操作看起来像调了两个XHProf函数:

        • load::lib/common.php - 内核加载和编译文件的工作。[注:如果您使用的了PHP的opcode 缓存比如APC之类的,只有当缓存失效时才会去编译。
        • run_init::lib/common.php -由于包含操作引起的初始化操作等。
      3. foo@<n> :意味着这是一个foo()函数的递归调用。<n>代表递归深度。递归可能是直接的,(比如由于foo() --> foo() ) ,也可能是间接的(如由于foo()-> goo() ->foo()。
    • 限制

      真正的层次剖析器会在每一个数据采集点记录完全的调用堆栈。接下来,能够回答这些问题,如:第三次foo()调用 的开销是多少?或是当调用栈是a()->b()->bar()时bar()函数的开销是多少?

      XHProf只记录一级的调用上下文,因此只能回答关于一级一级函数调用的问题。事实证明,在实践中这是最主要的 利用情况。

      为了使这个更具体,看看下面的例子。

      假设你有:

      1 call from a() --> c()
      1 call from b() --> c()
      50 calls from c() --> d()

      虽然XHProf可以告诉你, d()被c()调用了50次,却不能告诉你,有多少次分别是由a()和b()引起的。[我们可以推测,也许有25次是因为a(),有25次是由于b(), 但未必如此。 ]

      然而在实践中,这没什么大不了。

  3. 安装XHProf扩展

    这个扩展在"extension"子目录里。


    注:Windows的版本还没有实现。目前我们已经在Linux/FreeBSD 上测试了xhprof。

    0.9.2及以上版本的XHProf也正计划着移植到Mac OS下。[我们在Mac OS 10.5下测试过。]

    注: XHProf使用RDTSC指令(时间戳计数器)来实现一个真正的低资源消耗的计数器[针对elapsed time]。因此目前xhprof还 只适用于x86架构。此外,因为RDTSC的数据不能在CPU间同步,在剖析时xhprof会将程序绑定在单个 的CPU。

    如果SpeedStep技术是打开的,XHProf的基于RDTSC定时器的功能就不能正 常工作了。这项技术在某些英特尔处理器上是可用的。[注:苹果台式机和笔记本电脑一般都将SpeedStep技术预设开启。使用XHProf,您需要禁用 SpeedStep技术。 ]


    下面的步骤,应该在Linux / Unix环境下进行。

    % cd <xhprof_source_directory>/extension/
    % phpize
    % ./configure --with-php-config=<path to php-config >
    % make
    % make install
    % make test

    php.ini文件 :您可以更新您的php.ini文件来自动加载您的扩展。将以下内容添加到你的php.ini文件。

    [xhprof]
    extension=xhprof.so
    ;
    ; directory used by default implementation of the iXHProfRuns
    ; interface (namely, the XHProfRuns_Default class) for storing
    ; XHProf runs.
    ;
    xhprof.output_dir=<directory_for_storing_xhprof_runs >
  4. 使用XHProf来做性能分析

    用下面的示例程序来试着产生一些原始的性能数据:

    foo.php

    <?php

    function bar($x) {
    if ($x > 0) {
    bar($x - 1);
    }
    }

    function foo() {
    for ($idx = 0; $idx < 2; $idx++ ) {
    bar($idx);
    $x = strlen("abc");
    }
    }

    // start profiling
    xhprof_enable();

    // run program
    foo();

    // stop profiler
    $xhprof_data = xhprof_disable();

    // display raw xhprof data for the profiler run
    print_r($xhprof_data);

    运行上面的测试程序:

    % php -dextension=xhprof.so foo.php

    你应该得到的输出如下:

    Array
    (
    [foo==>bar] => Array
    (
    [ct] => 2 # 2 calls to bar() from foo()
    [wt] => 27 # inclusive time in bar() when called from foo()
    )

    [foo==>strlen] => Array
    (
    [ct] => 2
    [wt] => 2
    )

    [bar==>bar@1] => Array # a recursive call to bar()
    (
    [ct] => 1
    [wt] => 2
    )

    [main()==>foo] => Array
    (
    [ct] => 1
    [wt] => 74
    )

    [main()==>xhprof_disable] => Array
    (
    [ct] => 1
    [wt] => 0
    )

    [main()] => Array # fake symbol representing root
    (
    [ct] => 1
    [wt] => 83
    )

    )

    注:The raw data only contains "inclusive" metrics. For example, the wall time metric in the raw data represents inclusive time in microsecs. Exclusive times for any function are computed during the analysis/reporting phase.

    注意:默认情况下只有调用次数和占用时间是记录了的。您也可以选择同时记录CPU 时间和/或单纯记录内存使用量。将下面这一行:

    xhprof_enable();
    换成:
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); ;

    您应该得到如下的输出:

    Array
    (
    [foo==>bar] => Array
    (
    [ct] => 2 # number of calls to bar() from foo()
    [wt] => 37 # time in bar() when called from foo()
    [cpu] => 0 # cpu time in bar() when called from foo()
    [mu] => 2208 # change in PHP memory usage in bar() when called from foo()
    [pmu] => 0 # change in PHP peak memory usage in bar() when called from foo()
    )

    [foo==>strlen] => Array
    (
    [ct] => 2
    [wt] => 3
    [cpu] => 0
    [mu] => 624
    [pmu] => 0
    )

    [bar==>bar@1] => Array
    (
    [ct] => 1
    [wt] => 2
    [cpu] => 0
    [mu] => 856
    [pmu] => 0
    )

    [main()==>foo] => Array
    (
    [ct] => 1
    [wt] => 104
    [cpu] => 0
    [mu] => 4168
    [pmu] => 0
    )

    [main()==>xhprof_disable] => Array
    (
    [ct] => 1
    [wt] => 1
    [cpu] => 0
    [mu] => 344
    [pmu] => 0
    )

    [main()] => Array
    (
    [ct] => 1
    [wt] => 139
    [cpu] => 0
    [mu] => 5936
    [pmu] => 0
    )

    )

    在分析时跳过内置函数

    默认情况下, PHP的内置函数(如strlen )也被分析了。如果您不希望分析内置函数(为了进一步减少性能分析的开销貌相或减小产生的原始数据) ,您可以使用XHPROF_FLAGS_NO_BUILTINS标 志,例如:

    // do not profile builtin functionsxhprof_enable ( XHPROF_FLAGS_NO_BUILTINS ) ;

    在性能分析时忽略特定函数( 0.9.2或更高版本支持)

    从0.9.2版本的xhprof ,你可以告诉XHProf在性能分析时忽略一些指定函数。这样,您就可以忽略,像功能用于间接函数调用,如call_user_func和call_user_func_array的 函数 。这些不必要的中间层,因为他们乱七八糟的父-子关系和间接的互相调用,使XHProf报告难以理解。

    要设定要忽略的函数列表,可以在分析时给xhprof_enable函 数 指定第二个参数[是个可选参数] 。例如,

    // elapsed time profiling; ignore call_user_func* during profiling
    xhprof_enable(0,
    array('ignored_functions' => array('call_user_func',
    'call_user_func_array')));

    or,

    // elapsed time + memory profiling; ignore call_user_func* during profiling
    xhprof_enable(XHPROF_FLAGS_MEMORY,
    array('ignored_functions' => array('call_user_func',
    'call_user_func_array')));
  5. 设置XHProf用户界面

    1. PHP源码目录结构

      XHProf的用户界面的由PHP实现。代码存放在两个子目录中: xhprof_html/和xhprof_lib/ 。

      xhprof_html目录包含了3个顶级PHP页面。

      • index.php :查看一个单一运行或差异报告。
      • callgraph.php :以图片的形式查看一次XHProf运行的调用关系图。
      • typeahead.php :在XHProf的报告中被后台调用来进行函数的自动补全。

      该xhprof_lib目录包含进行分析和显示的支持代码 (计算 扁平的性能信息,计算diffs,从多次运行中汇总数据等等) 。

    2. Web服务器配置:您需要确保您的Web服务器有权限读取xhprof_html/目 录可,并且能运行PHP脚本。

    3. 管理XHProf运行

      客户端能很灵活地保存他们从XHProf运行中得到的XHProf原始数据。用户界面层 的XHProf提供了一个 iXHProfRuns接口(见xhprof_lib / utils / xhprof_runs.php ),客户端可以利用。这使得客户端能够告诉用户界面层,如何获取XHProf运行后产生的对应数据。

      XHProf的UI 库自带的有一个基于文件的iXHProfRUns接口实现,即“ XHProfRuns_Default”(见xhprof_lib/utils/xhprof_runs.php)。这个自带的实现将XHProf运行结 果存在ini配置的xhprof.output_dir参 数指定的某个目录下。

      一次XHProf运行,必须用一个命名空间和运行编号来唯一确定。

      一)XHProf数据的永久保存 :

      假设您使用的iXHProfRuns接口的XHProfRuns_Default这 个默认实现方式,一个典型的XHProf运行并保存结果的操作可能就是这样子的:

      // start profiling
      xhprof_enable();

      // run program
      ....

      // stop profiler
      $xhprof_data = xhprof_disable();

      //
      // Saving the XHProf run
      // using the default implementation of iXHProfRuns.
      //
      include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
      include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

      $xhprof_runs = new XHProfRuns_Default();

      // Save the run under a namespace "xhprof_foo".
      //
      // **NOTE**:
      // By default save_run() will automatically generate a unique
      // run id for you. [You can override that behavior by passing
      // a run id (optional arg) to the save_run() method instead.]
      //
      $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

      echo "---------------\n".
      "Assuming you have set up the http based UI for \n".
      "XHProf at some address, you can view run at \n".
      "http://<xhprof-ui-address >/index.php?run=$run_id&source=xhprof_foo\n".
      "---------------\n";

      上述代码就会将运行结果保存在xhprof.output_dir ini参数指定的特定目录下。文件的名称可能会是49bafaa3a3f66.xhprof_foo类似的东 东 ;两部分分别是运行编号( “ 49bafaa3a3f66 ” )和命名空间( “ xhprof_foo ” )。[如果您想创建/指定自己的run ID (如数据库中的序列号,或时间戳) ,您可以通过明确的给save_run方法 指定一个run id。

      b )使用自己实现的iXHProfRuns

      如果您希望您的XHProf运行存储在不同的数据库(例如用一个压缩格式,或者其他什么地方比如数据库等),您需实现一个类,这个实必须实现 iXHProfRuns ( )接口。

      您还需要修改“xhprof_html/"目录中3个主要的PHP入口文件 (index.php , callgraph.php , typeahead.php ),使用新的类而不是默认的类XHProfRuns_Default 。改变3个文件的这一行:

      $xhprof_runs_impl = new XHProfRuns_Default();

      您还需要“include”声明了上述class的文件。

    4. 从用户界面中访问各次运行

      一)看单一运行报告

      要查看run id是<run_id>和命名空间是<namespace>的报告,访问URL:

      http://<xhprof-ui-address>/index.php?run=<run_id>&source=<namespace>

      例如,

      http://<xhprof-ui-address>/index.php?run=49bafaa3a3f66&source=xhprof_foo

      二)查看diff报告

      要查看命名空间<namespace>下runid分别是< run_id1>和<run_id2>的两个报告,访问URL:

      http://<xhprof-ui-address>/index.php?run1=<run_id1>&run2=<run_id2>&source=<namespace>

      三)汇总报告

      您也可以指定一组run id来汇总得到您想要的报告视图。

      如果你有三个XHProf运行,都在"benchmark‘命名空间下,run id分别是1,2,3。要查看这些运行的汇总报告:

      http://<xhprof-ui-address>/index.php?run=1,2,3&source=benchmark

      加权汇总 :进一步假设,上述3个运特分别对应三种程序,p1.php,p2.php和p3.php ,通常以20%,30%,50%概率混合:要查看汇总报告所对应的加权平均数这些运行使用:

      http://<xhprof-ui-address>/index.php?run=1,2,3&wts=20,30,50&source=benchmark

  6. 在生产环境中使用XHProf的注意 事 项

    这里给出一些意见和准则。您的情况可能会有所不同:

    • CPU的计时器( getrusage )在Linux上开销很大。为了在函数级别更有用,这个是粗粒度的(毫秒精确度,而不是微秒水平)。因此,使用XHPROF_FLAGS_CPU模式时, 在报告里,数字上的误差往往会更高。

      我们建议在生产环境中使用 "占用时间+内存" 来做性能分析。[注:内存性能分析模式的额外开销很低。 ]


      // elapsed time profiling (default) + memory profiling
      xhprof_enable(XHPROF_FLAGS_MEMORY);
    • 对随机抽样的部分page/request来做性能分析,对于获取您的生产环境的负载 情况特征数据,其实足够好了了。

      分析万分之一的请求,可以用下面的代码:

      if (mt_rand(1, 10000) == 1) {
      xhprof_enable(XHPROF_FLAGS_MEMORY);
      $xhprof_on = true;
      }

      request结束时(或是在退出函数中) ,您可以这么做:

      if ($xhprof_on) {
      // stop profiler
      $xhprof_data = xhprof_disable();

      // save $xhprof_data somewhere (say a central DB)
      ...
      }

      然后,您就可以用xhprof_aggregate_runs()来按时间(比如,每5 分钟/每小时/每天),或是按页面类型/request类型来汇总。

  7. 轻量级采样模式

    Xhprof扩展还提供了一个轻量级采样模式 。采样间隔为0.1秒。采样记录了整个函数调用堆栈。如果想以增加极低的负载作代价来进行性能监控和诊断,采样模式就是你想要的。

    XHProf扩展提供的与采样模式相关的函数有xhprof_sample_enable()和xhprof_sample_disable() 。

    [ 待定 :关于采样模式更详细的文档。 ]

  8. 附加功能

    xhprof_lib/utils/xhprof_lib.php文 件包含额外的库函数,可用于维护/汇总XHProf运行结果。

    例如:

    • xhprof_aggregate_runs() :可用于多次XHProf运行结果汇总到一个单一的运行。这可以帮助您使用XHProf来建立一个全系统“的函数级别”的性能监测工具 。 [例如,您可以在生产环境中定期抽样XHProf的数据,产生小时/日级别的报告。 ]
    • xhprof_prune_run() :汇总大量XHProf运行结果(特别是如果它们对应不同类型的程序)将可能导致callgraph规模变得太大。您可以使用xhprof_prune_run功 能来修剪的callgraph数据中只占总运行时间中很小比例的子树。
  9. 依赖性

    • JQuery的Javascript :在提示和函数名称补齐上 ,我们利用了JQuery这个JavaScript库。JQuery是基于MIT和GPL licencse ( http://docs.jquery.com/Licensing ) 的。XHProf用到的JQuery相关代码,在xhprof_html/jquery子 目录。
    • dot(图像生成工具) :调用关系视图工具( [查看Callgraph ] )这个功能依靠dot工具实现。 “点”是一种绘制/生成有向图的工具。
    • 鸣谢

      查询分析结果的HTML用户界面受到了Oracle 的存储过程语言PL/SQL里的一个相似的小工具的启发。但是仅仅如此,他们的内部性能分析过程是完全不同的。

--EOF--
额,样式我不管了。觉得不好的还是查看原文吧。