让程序员不再苦逼的四大神器(程序员必备生活神器)

网友投稿 768 2022-09-13

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

让程序员不再苦逼的四大神器(程序员必备生活神器)

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

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

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

Xdebug

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

tar –zxvf xdebug-2.3.3.tgz cd xdebug-2.3.3 phpize ./configure –with-php-config=/usr/bin/php-configmake make install

再增加相应的配置到 php.ini ,需要注意有两点:

1. xdebug 是 zend_extension

2. 端口默认是 9000,和 php-fpm 的缺省端口冲突,所以这里换用 9100

[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 的第一行停止。

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

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

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

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

XHProf

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

[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/。即可。

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

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

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

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

比如:

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

运行后,得到如下效果:

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

SocketLog

SocketLog 的使用,主要要分成三个步骤,第一步是安装 Chrome 插件。可以从 github 下载的安装包中去安装,或者可以从 Chrome 应用商店下载。

执行 node server/index.js 即可。

安装好插件之后,就在 Chrome 上看到如下图标。灰色表示没有连接上。

同时启动了服务器,做好设置,就会看到图标变成蓝色了。

需要注意的是,尽管我们这里监听地址配置成了本地地址,其实也可以配置远程地址。不过远程地址的话记得打开服务器上的防火墙,因为一般1229端口在防火墙中是关闭的。

SocketLog 的原理,是在服务器端,往 WebSocket 服务器上写数据,作为客户端的 Chrome 插件,即能收到数据。所以不管是远程 API 调用,还是网页访问,只要在程序中往这个 WebSocket 服务器写了数据,只要监听了这个 Websocket 服务的客户端都能收到相应的调试日志。

第三步是埋代码。使用方法也很简单。比如我们在上面的 ThinkPHP 的 index.php 加入两行代码。会看到如下输出 。

然后我们在其他终端上也访问一下这台机器的这个页面地址,看看是否能得到输出呢?开始没有任何输出效果。因为缺省情况下是不记录普通用户所调用的 slog 的。

在 slog 之上的语句加上这一行,就有了。

slog(array('force_client_id'=>'test'),'set_config');

Test 这个插件的用户,收到了所有的 slog 消息。如下图所示:

并且这种输出 ,无论是别的用户触发,而还后台服务程序,均可以输出 。所以非常地方便,开发人员在自己的机器上就收集到了想要收集的用户所触发的调试信息。

然后为了体现对 SQL 语句的监听。我们在 ThinkPHP/Library/Think/Db/Driver.class.php 的第1139行加上 slog($str),然后再访问页面,就得到了如下输出 ,可见实现了对 SQL 日志的监控。

SocketLog 的功能看起来虽然简单,但是却非常有用、好用,是不可多得的开发神器。有关 SocketLog 的更多介绍和使用说明,建议现在就立刻下载,并且进入 github 主页好好地研究吧!

1. 获取授权编号

授权凭证,用于配置和身份识别。

2. 下载 PHP agent 安装程序

3. 解压 PHP Agent

tar -xzf _php_Agent_2.3.11.tar.gz

4. 安装 PHP Agent

定位路径至您的安装包所在文件夹

cd -php5-linux-install-script

执行安装命令

sudo ./-install install

5. 输入 License Key

若出现以下信息,则代表安装成功。

is now installed on your system. Congratulations!

当页面出现以下提示时,启动 Daemon

And then start php-agent in /usr/bin/-daemon

运行以下指令来启动 Daemon

sudo /usr/bin/-daemon

重启 Apache 或你使用的 web 调度程序 「如 php-fpm 」

6. 静候5分钟,开启 之旅

收集的数据很丰富。将收集的响应时间数据,分为四个大块:

Web 事务,就是页面业务逻辑本身数据库,数据库的连接和数据读取错误统计,对所有类型的错误做了归类统计外部服务,即外部 API 等的设备

以笔者的站点为例,12小时的数据如下图:

从上面这个图,我们看到响应时间,慢的达到了600 ms 以上,那是什么导致的呢?我们可以分别查看:

可见 Web 事务比较稳定,可以比较清楚地看到平均的响应时间在 50ms-75ms之间。

数据库响应时间也很短,在几 ms 这个级别。而外部服务就明显在几百 ms 这个级别,还有的高达 600 ms 。

不说别的,就通过这简单的报表,从目前看,就可以定位到,想要做优化,从外部服务的响应时间上下手优化,带来的效果是最大的。

下面我们再来看看三个细化一层的报表 ,在 Web 事务统计中,尽管平均数很低,但是也列出了响应时间最长的5个请求。如下:

从上面的数据可以看出,响应时间最长的几个,主要突出在 bind.php,这个是负责 QQ 登录的请求,需要向腾讯请求数据。

而在数据库一栏中,可以看到最慢的5个表格的情况。

在外部的服务中,果不出所料,是对微博、微信、QQ 登录、七牛上传、支付宝通知等外部服务,所占时间最长。如下图所示。

这只是普通的统计报表,对于具体的某一个慢的页面,更有详细的调用分析。

在后台报表中,我们同样也能看到是哪些 SQL 语句慢。比如如下是 bind.php 中慢的 SQL 语句。

更为重要的是,还有所有错误信息的收集,也一目了然。

以上四个项目,让我们对自己所写的代码,更加成竹在胸,无论是执行过程还是调优着手了都有了充分的把握。特意对比,汇总整理的这四大神器,希望它们能改善每一位 PHP 开发者的生活,让我们的 PHP 开发不再那么地苦逼!

上一篇:想打造一款成功的移动应用?你最需要关注性能指标!(移动应用分析)
下一篇:效仿阿里的 Etsy:文艺青年 or 技术宅男?(阿里模仿的谁)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~