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

乘风破浪,启航未来!

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

做 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,在第四部分我们再介绍。

未完,待续... ...

时间: 2024-12-22 10:21:28

让程序员不再苦逼的神器(上)的相关文章

让程序猿不再苦逼的四大神器

做程序猿「媛」是一个苦逼的活,大周六地早起在技术群里招呼.看到没有啥人响应,说了一句.「预计都没有醒」.然后一位哥们抛过来,「在加班」 ! 做 Web 开发更是一个苦逼的活.不像是做 iOS,搞定client.基本上就万事大吉了. 做 Web 开发不仅仅是要做后端.前端也须要了解和熟悉! 做前后端通吃的 DevOps 全栈project师绝对是最苦逼的活,不但须要做开发,而且还要了解运维.优化.不会运维的project师绝对不是一个好架构师. 但所幸的事.一个优秀的project师虽然非常忙,虽

Java程序员最喜欢的五大神器

程序员留给大家的印象,不修边幅,沉默寡言.但程序员对于自己使用的神器,相当舍得花钱.今天咱们梳理下程序员最喜欢五大神器. 分享之前我推荐下我自己建的Java学习群:Java进阶群:766529531,欢迎进阶中的Java小伙伴进×××流学习. 1.Mac电脑 Mac电脑在一定程度上体现了极致,高品质,这点和优秀程序员内在气质是吻合的,程序员对于自己代码都会一直不停在优化,重构以期望做到做好.苹果电脑在设计上追求每个细节做到极致,哪怕是外观的点点滴滴,诚然Mac电脑有这样那样的不兼容的因素,但是还

中国现代程序员的苦B生活

程序员又名"程序猿"是从事程序开发.维护的专业人员:"干得比驴累,吃得比猪差,起得比鸡早,睡得比狗晚,看上去比谁都好,五年后比谁都老.很多程序员都曾这样感慨和抱怨过自己的生活状态." 亚健康状态是人体处于健康和疾病之间的过渡阶段,在身体上.心理上没有疾病,但主观上却有许多不适的症状表现和心理体验. 对于程序员来说上班的主要工作就是一天到晚坐在电脑前不断的编辑程序:所以程序员有八成上是近视眼,同时对于程序员来说,工作场地是不限制的,也就是说可以在家里工作,所以程序员也

恭喜你!2018年秒变程序员不再是梦!

我们的生活中出现了很多小程序程序员的重要性也提现出来了,很多人都很崇拜程序员,觉得ta们很厉害,高深莫测的,好像无所不能一样.如果你也想成为这样的人,那么,恭喜你!中奖了!2018年我们一起来实现这个梦想吧! 很多人都在问小程序有什么优势??????我们为什么要开发小程序?????如何快速开发小程序?????. . . . . . 小程序有以下优势1.小程序不需要下载和安装--省时省力省空间 方便王能--随时随地只需要打开就能用,用完了就离开,.2.流量大--微信有9亿多的用户,这也给小程序引入

程序员超浓鸡汤,知乎上赞同数最高的999个回答

原文出处 http://lanbing510.info/2016/04/14/ZhiHu-Good-Answers.html#title0 最近发现这个文章,真的是非常适合程序员看的鸡汤文列表,超强浓缩版的!!! 1哪些素质很重要,却是读书学不来的?101501肥肥猫 2有哪些很重要又被忽视的炒菜技巧?85658庄力 3想要充实自己,有哪 10 本书和 10 部电影值得推荐?77738Jee Xin 4要怎样努力,才能成为很厉害的人?76144朱炫 5如何看待「医生拒绝给艾滋病人做手术」?748

黑马程序员(Java)----面向对象(上)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 面向对象 2.1了解面向对象 2.1.2 面向对象的概念 面向对象是相对面向过程而言,面向对象和面向过程都是一种思想.面向过程强调的是每一个功能的步骤,代表语言:C语言.面向对象强调的是对象,然后由对象去调用功能,代表语言:Java.C++.C#. 例子:把大象装进冰箱.用面向过程实现:1. 打开冰箱.2. 存储大象.3. 关上冰箱."打开"."存储"."

前大疆程序员离职后,把代码上传 GitHub,令公司损失百万,获刑半年!

该员工之前在大疆的子公司担任软件工程师,公司对他很器重,负责编写农业无人机的管理平台和农机喷洒系统代码.他在Github 开设账号,并建立了"公有仓库",把代码上传至了 GitHub 公有仓库. 经鉴定,大疆这些泄露出去的代码具有非公知性,且已用于该公司农业无人机产品,属于商业秘密.经评估,这次泄漏公司造成经济损失116.4万元人民币. 案发后,这位员工第一时间删除了相关代码,并积极配合调查,防止事态扩大.他在推特上表示,"无意泄露了大疆的机密"."我很后

【Linux程序员福音】在Visual Studio上用C++写Linux

如今我们正在开发一个新的插件,一个能够让开发者在Visual Studio(以下简称 VS ) 上建构能够在 Linux 上运行 C++ 程序的套件.开发者可以借由这个插件将 C++ 程序移转到 Linux 服务器.PC 以及移动设备上,也同时可以借由这个插件将这些机器连结至你的 VS 上. VS 将会自动地复制一份并在远端建构你的来源档,再运行带有除错器的应用程序.我们的这项计划也针对特殊的架构提供系统支持,包含 ARM 等.下方文章将继续介绍使用我们这套全新的 Linux 计划. 目前我们仅

程序员修炼之路-(3)排序(上):基本排序

1 基本排序 对于所有排序算法,被排序元素需要满足下列数学性质: ?  自反性(reflextive):for all v,v=v ?  对称性(antisymmetric):for all v and w,if v<w then w>v and if v=w then w=v ?  传递性(transitive):for all v,w and x,if v<=w and w<=x then v<=x 对于包含这样元素的数组,我们才能对其排序. 1.1 选择排序(selec