xhprof安装,配置,使用

Posted: 2016-12-06 in php

第一阶段:生成profile文件

安装

  • pecl install channel://pecl.php.net/xhprof-0.9.2 (目前是Beta版),
  • 如果不能直接install,则可以 pecl download下来后,phpize && ./configure && make && make install
  • 编辑php.ini 添加如下
    extension=xhprof.so
    ;Path to store xhprof file,
    ;需要定期清理
    ;注意创建路径和权限
    xhprof.output_dir="/logs/xhprof"

在生产环境中启用

  • /home/xLight/php/lib/prepend.php:
    <?php
    //* 启动xhprof,万分之一概率
    if(mt_rand(110000)==1 && function_exists('xhprof_enable') )
    {
            xhprof_enable(XHPROF_FLAGS_MEMORY);//XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY  ,官方不建议在生产环境开启XHPROF_FLAGS_CPU
            define('XHPROF_ON',true);//标记
            //定义输出profile文件的规则
            define('XHPROF_TIMELIMIT'10);//记录执行超过这个时间的。单位:秒
            define('XHPROF_MEMLIMIT'50);//记录内存使用超过这个量的。单位:M
            //define('XHPROF_DIR', '/'.date('Ymd_H') );  //开启本行则启用自己的按时间拆分路径逻辑
            register_shutdown_function('xhprof_save'); //die强行终止的程序也会有记录
    }
    //*/
  • /home/xLight/php/lib/append.php:
    function xhprof_save(){
    //* 结束 xhprof并保存
    if(!XHPROF_ON) return;
    // stop profiler
    $xhprof_data = xhprof_disable();
    //记录执行时间大于t秒 或内存占用大于m兆
    if($xhprof_data['main()']['wt'] < XHPROF_TIMELIMIT *1000000 && $xhprof_data['main()']['mu'] < XHPROF_MEMLIMIT *1000000return;
    //parameter "source" for UI
    $source = $_SERVER['HTTP_HOST'].'__';//add host
    $source .= $_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : $_SERVER['SCRIPT_FILENAME']; //add script
    $source = str_replace(array('/','.','&','?','='),'_',$source);
    //parameter "run" for UI
    $run = str_pad((int)($xhprof_data['main()']['wt']/1000000), 4"0", STR_PAD_LEFT);// 程序执行秒数,扩展成4位,前面补0
    $run .= '_'.str_pad((int)($xhprof_data['main()']['mu']/1000000), 4"0", STR_PAD_LEFT);// 程序占用内存,扩展成4位,前面补0
    // dir for save file
    $dir = $XHPROF_DIR ? $XHPROF_DIR : '';
    $FullDir = ini_get('xhprof.output_dir').'/'.$dir;
    if($dir && !file_exists($FullDir))
      @mkdir( $FullDir , 0777 ,true);
    $FullPath = $FullDir.'/'.$run.'.'.$source ;
    file_put_contents($FullPath , serialize($xhprof_data));
    }//*/
  • 编辑php.ini,添加如下内容
    auto_prepend_file = "/home/xLight/php/lib/prepend.php"

第二阶段:分析profile文件

配置UI界面

  • 只要让通过web访问xhprof-0.9.2/xhprof_html/index.php即可。
  • 实际上xhprof产出的就是个php数组,序列化之后保存到磁盘
  • xhprof UI就是读取这个序列化后的数组并分析。

使用UI分析profile文件

  • 正在coding的列表程序:
  • 首先要获得profile对应的source和run两个参数
  • source是对应程序调用
  • run对应该程序某一次调用,目前该数值为程序执行的秒数与占用内存的结合。比如:”0023_0015″ 代表执行23秒,占用内存15M
0002_0003.test_xlight_me___Goods06_BJBetIndex_php?GoodsType=Score_GoodsNo=090822
0002_0003.test_xlight_me___Goods06_BJBetIndex_php?GoodsType=TotalGoals
0002_0003.test_xlight_me___Goods06_BJBetIndex_php?GoodsType=TotalGoals_GoodsNo=090822
0002_0003.test_xlight_me___Goods06_BJBetIndex_php?GoodsType=WDL
0002_0015.___home_Html_Shell_Buy_AutoDispenseProject_php
0002_0015.___home_Html_Shell_Buy_DeductProjectMoney_php
0002_0015.liyq_xlight_me___Goods06_BJBetIndex_php?GoodsType=Score
0002_0015.liyq_xlight_me___Goods06_BJBetIndex_php?GoodsType=WDL
0003_0000.test_xlight_me___Remoting_gateway_php
0003_0015.___home_Html_Shell_Buy_ComputeAssure_php
0003_0015.liyq_xlight_me___Goods06_BJBetIndex_php?GoodsType=TotalGoals
0004_0000.test_xlight_me___Remoting_gateway_php
0004_0009.hejm_xlight_me___User_UserCenter_php
0004_0015.___home_Html_Shell_Buy_ComputeAssure_php
0005_0000.test_xlight_me___Remoting_gateway_php
0005_0003.test_xlight_me___
0005_0008.hejm_xlight_me___Goods06_P33D_P3New_php?GoodsType=P3
0005_0015.___home_Html_Shell_Buy_ComputeAssure_php
0005_0015.___home_Html_Shell_Buy_DeductProjectMoney_php
0006_0000.test_xlight_me___Remoting_gateway_php
0006_0010.hejm_xlight_me___
0006_0015.___home_Html_Shell_Buy_ComputeAssure_php
0006_0015.___home_Html_Shell_Buy_DeductProjectMoney_php
0007_0000.test_xlight_me___Remoting_gateway_php
0007_0010.hejm_xlight_me___
0007_0015.___home_Html_Shell_Buy_ComputeAssure_php
0008_0000.test_xlight_me___Remoting_gateway_php
0009_0000.test_xlight_me___Remoting_gateway_php
0009_0008.hejm_xlight_me___Goods06_SSQ7LC_
0010_0000.test_xlight_me___Remoting_gateway_php
0010_0001.test_xlight_me___Remoting_gateway_php
0011_0000.test_xlight_me___Remoting_gateway_php
0011_0004.liqh_xlight_me___
0011_0015.___home_Html_Shell_Buy_DeductProjectMoney_php
0013_0001.test_xlight_me___Remoting_gateway_php
0014_0001.test_xlight_me___Remoting_gateway_php
0016_0001.test_xlight_me___Remoting_gateway_php
0016_0018.huxl_xlight_me___
0017_0000.test_xlight_me___Remoting_gateway_php
0019_0000.test_xlight_me___Remoting_gateway_php
0024_0001.test_xlight_me___Remoting_gateway_php
0027_0001.test_xlight_me___Remoting_gateway_php
0029_0001.test_xlight_me___Remoting_gateway_php

产品设计十诫

  1. 不要忘记目标,统一目标下的产品和销售也许会有分歧,但不会对立。
  2. 不要执着于细节,细节有改善的机会,而全局性的错误则可能是致命的。
  3. 不要延续错误。
  4. 不要追逐功能,而应抓住产品的神髓——最佳的用户体验是基于最基础的信息(功能)量(层次)上。
  5. 不要尝试一步到位,达成最佳结果的最优步骤未必是一步。
  6. 不要停止思考,要多想一些:这个功能上线后三个月,是不是还有发展?
  7. 不要麻烦用户,该是产品解决问题就要由产品解决。
  8. 不要解释产品,要让产品解释自己。
  9. 不要满足用户——要引导——用户是永远不会满足的。
  10. 不要忘记自己人。

其中第7条对应的就是”关我鸟事“系列。

开发工具:
PHP,mac os内置php,版本还挺高,5.3.4
装了xcode4,下载了2天2夜

textmate 据说超好,但是我一点都不觉得,我觉得editplus最舒服了。但是对中文兼容不好,显示中文参考这个 ,输入问题参考这个 2.0已经解决中文问题。
Coda 用起来感觉不错,内置remote编辑功能,对于我这种在开发服务器上写代码的人很方便。
svn/git工具,竟然都是收费的: CornerStone(推荐)、Version、SmartSVN;GitHub、GitBox、GitX

从小众软件翻mac软件,一个有实际价值的都没有,果然够小众。

dropbox,这还用介绍吗?
SimpleSSHProxy ,通过ssh建立http-proxy的小工具,menu bar上有个小图标,不占dock
twitter不错

Sparrow这个gmail客户端不错,有广告条,不过基本不影响

qq mac版,这个还是要装的

阿里旺旺 mac版,对于我这个在网上花钱占支出70%以上的,这个必备

浏览器装了Opera 和 Chrome,内置的Safari也很好用。
Opera的mac稳定性明显比windows版差。不过用惯了,各种内置贴心小功能真的很省心,
比如 “tab分组”“锁定tab”,将“使用代理服务器”“允许javascript”开关直接拖到界面上,侧边栏,实在欲罢不能。

来源:http://daxu.net/archives/1034.html ,作者应该是雅虎中国的工程师

Fenng: Yahoo! 中国犯了阿里巴巴 1001 个错误中的 1000 个

作者:大徐 发表时间:2009-09-22 星期二 13:28:27
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处。

曾经,在11个半月以前,我请了婚假,到了新的公司。11个半月过去了,几波人做了好几个版本,数百人数十个产品线堆砌出来。

想知道你做的产品怎么样?从头开始看看吧。别老用那个资料丰富、关系众多的帐号体验了,别老用自己熟悉的点击、熟悉的操作去体验了,别老用惯用的提供功能、提供丰富内容的思维去干活了。用户无所是从,忙然,不知如何开始,用户实际的行为就是迅速关掉浏览器。用户千辛万苦完成激活(注册),得到的是这么一个首页,完善个人资料、上传头像,然后呢?甚至我自己在用一个全新的帐号使用我自己产出的产品时也觉得无所适从,茫然,不知如何开始,我真的很想迅速关掉浏览器。

08 年9月,需求出现爆炸式的增长,来自内部的、外部的,自己的、领导的各种需求扑面而来。需求失控,bug众多,眼看新的版本几乎无法发布。09年5月,同样的事情再次发生,部门众多,需求众多,内部协调的成本很大,外部的需求、领导的需求再次开始呈膨胀的态势发展。这是一个轮回吗?一个8个月的轮回?

我们忙,我们累,我们老加班,但是我的活计不争气。实话说,我觉得我真的忙,我觉得我一个人在做一个团队的工作,和几个部门沟通很多事,外来很多需求,自己也有很多需求,领导时不时的还排点活。我觉得我真的累,每天都像打仗一样,一波一波的人,说来说去,说去说来。无尽的沟通、无尽的会议,无尽的文档、无尽的邮件,每天补漏很多,每天做很多决定,每天沟通很多事情。我真的老加班,平时加班到10点、11点,五一前后一连几个周末加班。但是我不得不说,我们的活计不争气,它真的很烂。

那么多破玩意,全塞在这网页里面。那么多运营的东西挂在首页上,就那么点位置每个部门的人还来争取,都觉得那个地方就应该是他们的。给用户喂那么多东西,谁喜欢?海子的诗和那些不知道是干什么的的东西,玩浪漫?玩文化?玩深沉?这些东西和用户有关吗?这些东西和自己有关吗?用户怎么加第一个好友?怎么发第一个邀请?怎么导入联系人?

09年5月,又一个大版本上线,可惜这个版本被老婆称为”你们的烂网站”,当老婆在开心网种着灵芝,一天被偷几十个雪莲,恐龙、大象、企鹅混养,参加拉力赛,换房子,加许如云为好友的时候,这种感觉真不好。

注:这是一篇几个月前随意记录的东西,事情已经过去,情况已经变化。

# Slow Query

log-slow-queries=/var/log/mysqld-slow.log

long_query_time=1

# 02-05 end

# add by xLight

max_connections = 400

innodb_buffer_pool_size = 2G

query_cache_size = 128M

expire_logs_days = 7

对于一个原创内容丰富,URL结构合理易于爬取的网站来说,简直就是各种爬虫的盘中大餐,
很多网站的访问流量构成当中,爬虫带来的流量要远远超过真实用户访问流量,甚至爬虫流量要高出真实流量一个数量级。
即使像JavaEye这样一向严厉封杀爬虫的网站,只要稍微松懈一段时间,爬虫流量就能轻易超过真实访问流量的2倍以上。
对于大型互联网网站来说,有足够的硬件资源来应付爬虫带来的庞大访问压力,也有足够的资源和能力去解决这个问题。
但是对于中小型互联网网站来说,爬虫带来的就是毁灭性打击了。

原文我就不贴了,自己去看吧:

应该认真看,逐条看,反复看

1. opkg安装需要的包

opkg install kmod-usb-storage kmod-scsi-generic block-mount kmod-fs-ext4 kmod-nls-utf8 kmod-fs-vfat

2. 编辑fstab添加自动mount上u盘
vi /etc/config/fstab

config 'mount'
option 'device' '/dev/sda1'
option 'options' 'rw,sync'
option 'enabled_fsck' '0'
option 'enabled' '1'
option 'target' '/mnt/share'

3. 先手工mount上u盘
mount /dev/sda1 /opt

4. 配置opkg,允许向u盘安装
vi /etc/opkg.conf

dest opt /opt

5. 安装openvpn到u盘

opkg install openvpn -d opt

6. 将openvpn的配置scp进去

7. 写个自动启动openvpn的脚本

*. 添加autoddvpn的配置,

来源: http://lifesinger.org/blog/2009/09/javascript-quick-combine/

Posted on September 25th, 2009 in 前端开发 by lifesinger

/**
 * 快速组合算法
 * 从 n 中任选 m(0 < m <= n) 个数的所有组合
 */
function quick_combine(n, m) {
    var t = ((1 << n) - (1 << n - m)).toString(2),
        r = [], s, p1, p2;
    while((r.push(t), p1 = t.indexOf("10")) >= 0) {
        s  = t.slice(0, p1);
        p2 = s.indexOf("1");
        t = (p2 > 0 ? ((1 << p1) - (1 << p2)).toString(2) : s)
             "01" + t.slice(p1 + 2);
    }
    return r;
}

算法思路:

假设场景为从 [a, b, c, d, e] 里, 5 选 3.

先设定第一个和最后一个组合为:
s = 1 1 1 0 0 // a,b,c
e = 0 0 1 1 1 // c,d,e

Step1. 从左到右找出第 i 个组合中的 10, 转换为 01, 并将 01 左边的 1 全部移动到最左边,得到新组合 t
Step2. 如果 t 不为 e, 继续 Step1

按照以上思路,可以得到:

1 1 1 0 0
1 1 0 1 0
1 0 1 1 0
0 1 1 1 0
1 1 0 0 1
1 0 1 0 1
0 1 1 0 1
1 0 0 1 1
0 1 0 1 1
0 0 1 1 1

共 10 种组合

网上流传的递归方案(好像是月影写的?没找到源头):

/**
 * 递归组合算法
 * 从 arr[1...n] 中任选 num(0 < num <= n) 个数的所有组合
 */
function combine(arr, num) {
    var r = [];
    (function f(t, a, n) {
        if (n == 0return r.push(t);
        for (var i = 0, l = a.length; i <= l - n; i++) {
            f(t.concat(a[i]), a.slice(i + 1), n - 1);
        }
    })([], arr, num);
    return r;
}

两种方案的性能对比: combine-test.html

在 Firefox, Chrome, Safari 浏览器中,快速组合算法优势非常明显。
在 IE 浏览器中,计算量比较小时,快速组合算法依旧有优势;但计算量大时,无优势,甚至不如递归。

2009-09-27: 修改快速组合算法,用 Math 代替 regex replace, 性能立刻提升,在所有浏览器下保持优势。

51js 讨论贴:http://bbs.51js.com/viewthread.php?tid=85574

目标

  • server需要能承载百万级别连接数
  • client端耗电量要低
  • client端内存占用要低

各个技术的对比

MQTTsocket.io(node.js)websocketxmpp(openfire)comethttp定时
单服务器并发连接10w300010w30w
耗电link1link1低,可控
client端资源占用较高很低
实时性较高较低*
项目活跃度mosquitto 1.0.2 – 20120819TooTallNate / Java-WebSocket github不断更新中