码迷,mamicode.com
首页 > 其他好文 > 详细

让程序员不再苦逼的神器(上)

时间:2015-07-03 18:53:30      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

乘风破浪,启航未来!

做程序猿「媛」是一个苦逼的活,大周六地早起在技术群里招呼,看到没有啥人响应,说了一句,「估计都没有醒」,然后一位哥们抛过来,「在加班」 !

做 Web 开发更是一个苦逼的活,不像是做 iOS,搞定客户端,基本上就万事大吉了。做 Web 开发不仅仅是要做后端,前端也需要了解和熟悉!

做前后端通吃的 DevOps 全栈工程师绝对是最苦逼的活,不但需要做开发,而且还要了解运维、优化,不会运维的工程师绝对不是一个好架构师!

但所幸的事,一个优秀的工程师尽管很忙,尽管要熟悉前后端、系统、运营、优化,但是在他的工具箱里,放着一大堆工具,让这种生活变得不那么苦逼。

这里就介绍四个让我们 DevOps 生活变得美好的神器。分别是 Xdebug、XHProf 、OneAPM 和 SocketLog。

 

Xdebug

作为开发人员,睡得最踏实的事是对自己写的代码了如指掌,无论是从功能层面,还是性能层面。而做 Web PHP 开发,比较棘手的一件事情就是代码的调试。作为脚本语言,在远程服务器端运行,客户端生成的全是 HTML 代码,一般认为我们无法准确地调试运行的情况,更不要说单步调试、变量监控等事情了。其实这是有误解的,有一个 PHP 扩展 Xdebug 能让方便地让我们调试远程服务器上运行的代码。

方法很简单,从Xdebug下载最新版的源代码。wget 解压:

1
2
3
4
5
6
tar –zxvf xdebug-2.3.3.tgz 
cd xdebug-2.3.3 
phpize 
./configure –with-php-config=/usr/bin/php-config
make 
make install

 

再增加相应的配置到 php.ini ,需要注意有两点: 1. xdebug 是 zend_extension 2. 端口默认是 9000,和 php-fpm 的缺省端口冲突,所以这里换用 9100

1
2
3
4
5
6
[xdebug]
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so 
xdebug.remote_enable=on 
xdebug.remote_handler=dbgp 
xdebug.remote_host=localhost 
xdebug.remote_port=9100

 

这样就装好了,就是如此简单,下面我们可以开始使用了。以 ThinkPHP 应用开发做例子吧。ThinkPHP 典型的单入口应用,调用层次相对复杂。所以想要了解调用堆栈还是比较麻烦的。要想得到某一行的调用堆栈,可以使用 PHP 自带的 debug_backtrace 函数可以获得,但是不怎么形象,返回来一个数组而已。而 Xdebug 就能让这一切可视化起来。

配合 Xdebug 使用的是 Netbeans 自带的调试工具。首先通过首选项修改了一下 PHP 调试的端口,从9000改成9100,其他不用动。注意在第一行停止是选上的,这将在 PHP 程序调试时,运行到第一行 PHP 代码时停止,在 ThinkPHP 中,即入口文件 index.php 的第一行停止。

技术分享

在本例中,笔者做了一个租车管理系统的示例,项目名为 zuches。将代码部署在 http://localhost/zuches 能访问的地方,索引文件是 index.php。

技术分享

由于 index.php 是入口文件,所以在 index.php 上点击右键,选择调试。

技术分享

然后 Netbeans 自动打开了如下地址,进入调试状态 :http://localhost/zuches/index.php?XDEBUG_SESSION_START=netbeans-xdebug 同时运行位置指示停留到了 index.php 的第一行。如下:

技术分享

点击继续运行,由于在 IndexController.class.php 的 index 方法中加上了断点,所以位置指示又停留在了相应的断点处。

技术分享

这个时候,我们可以查看中断时候的调用堆栈和变量了。通过堆栈可以方便地定位到各定位的类和相应方法。

技术分享

各种变量,无论是局部变量和实例属性,无论是 cookie,还是提交数据,都能在变量表中看到,一目了然。

技术分享

总之,Xdebug 让我们即使做的是服务器端页面和 API 开发,也可以像桌面应用开发一样,调试每一行代码了。

Xdebug 除了使用来进行单步调试之外,还能收集请求中的执行日志,记录每一个函数的执行过程。这些日志可以用 wincachegrind 等工具进行分析,看到函数的调用栈和所花的时间。这里不再赘述,我们也不是很推荐,因为 XHProf 在这块要轻量级和强大的多,不用如此费劲地下载日志,分析日志。

XHProf

如前文所述,对于 PHP 中函数调用栈和性能分析,XHProf 将 Xdebug 开的先河继承并发扬光大。XHProf 也是 PHP 扩展,不过不建议从http://pecl.php.net/package/xhprof 上下载,版本已有近2年没有更新了,最好从https://github.com/phacility/xhprof 上下载。下载编译配置和使用过程都很简单。

配置只需要加上如下两行:

1
2
[xhprof]
extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/xhprof.so

 

然后将要相应的 XHProf 代码配置到需要监控的页面中,即可以获得整个页面的执行中,各函数的调用报表。XHProf 提供了示例,配置成功运行如下:

技术分享

如何看到上面图中的效果呢?将 examples、xhprof_html、xhprof_lib 三个目录放到浏览器能访问到的地方,比如 localhost 的主目录内。修改 examples/sample.php 中的换成 如:localhost/xhprof_html/。即可。

然后访问 http://localhost/examples/sample.php 即可以得到输出结果如下:

技术分享

从 examples/sample.php 中可以看到,对于页面的监测分析,在页面顶部使用 xhprof_enable 开始,而性能的分析的结束,则是在页面底部使用 xhprof_disable 结束 。这样每次监控,都需要增加一段代码,所以为了规范起见。对 XHProf 相关的操作进行了封装。继续采用上例 ThinkPHP 版租车系统的例子,看看如何集成 XHProf 分析。

 

首先将对 XHProf 的操作封装成了一个类。

1
2
3
4
5
6
7
8
9
10
11
<!--?php class XHProf { private static $strNameSpace = ""; public static function init($strNameSpace = "myhome") { if (!function_exists("xhprof_enable")) { return; } self::$strNameSpace = strval($strNameSpace); $param = XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY; $path = getcwd(); require_once $path.‘/../xhprof_lib/utils/xhprof_lib.php‘; require_once $path.‘/../xhprof_lib/utils/xhprof_runs.php‘; xhprof_enable($param); register_shutdown_function("XHProf::genResult"); } public static function genResult() { $profiler_namespace = self::$strNameSpace; $xhprof_data = xhprof_disable(); $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs--->save_run($xhprof_data, $profiler_namespace);
        $profiler_url = sprintf(http:// . $_SERVER[‘HTTP_HOST‘] . ‘/xhprof_html/index.php?run=%s&source=%s‘, $run_id, $profiler_namespace);
        echo
            <p style="background: orange;">
                
        . ‘<a href="‘ . $profiler_url . ‘" target="_blank">Profiler output</a>
            </p>
‘;
    }
 
}

 

 

在这个封装的类中,首先检测了 xhprof_enable 函数是否存在,这可以用于判断是否成功安装配置了 xhprof 扩展。其次设置了参数,特别值得一提的是使用函数 register_shutdown_function 来注册一个操作,这个操作在页面结束之前,会自动运行。

这样,在分析页面性能之时,只需要在 ThinkPHP 应用的 index.php 上加上两行,即可以了。

比如:

1
2
require_once "xhprof.php"
XHProf::init("zuches");

 

运行后,得到如下效果:

技术分享

 

并且每一个页面,都有这样的输出。点击「Profiler output」即得到了报表。

 

技术分享

在本例中,可以看到最后的集成方法,运行时间超过了2 S,是值得关注并优化了。从报表中,可以首先看到各个方法或者函数的调用次数,运行时间,以及可以层层点进去看到父子层级的调用关系 。

需要注意的是,在线上,如上使用 XHProf 要慎重,即使打开,也要有限制条件地打开,比如当前用户是某些调试开发者用户时才打开。否则,普通用户看到这样的输出,则不明所以,给用户带来困惑,当然,我们也可以不输出,而将数据直接存储,在后台系统中查看,这样用户就感受不到了。有一个工具,可以完全消除这些纠结。那就是 OneAPM,在第四部分我们再介绍。

 

未完,待续... ...

让程序员不再苦逼的神器(上)

标签:

原文地址:http://www.cnblogs.com/itfree/p/4619307.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!