做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了

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

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

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

但所幸的事,一个优秀的工程师虽然很忙,虽然要熟悉前后端、系统、运营、优化,并且在他的工具箱里,放着一大堆工具,让这些生活显得不这么悲催。

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

Xdebug

作为开发人员,睡得最塌实的事是对自己写的代码了如指掌,无论是从功能层面,还是性能层面。而做WebPHP开发,比较棘手的一件事情就是代码的调试。作为脚本语言,在远程服务器端运行,顾客端生成的全是HTML代码,通常觉得我们难以确切地调试运行的情况,更不要说单步调试、变量监控等事情了。显然这是有误会的,有一个PHP扩充Xdebug能让便捷地让我们调试远程服务器上运行的代码。

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

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

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

图片[1]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[2]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[3]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

之后Netbeans手动打开了如下地址,步入调试状态:同时运行位置指示逗留到了index.php的第一行。如下:

图片[4]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[5]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[6]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[7]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

Xdebug不仅使用来进行单步调试之外,能够搜集恳求中的执行日志,记录每一个函数的执行过程。这种日志可以用wincachegrind等工具进行剖析,见到函数的调用栈和所花的时间。这儿不再赘言,我们也不是很推荐,由于XHProf在这块要轻量级和强悍的多,不用这么费力地下载日志,剖析日志。

XHProf

如前文所述,对于PHP中函数调用栈和性能剖析,XHProf将Xdebug开的先河承继并弘扬中信。XHProf也是PHP扩充,不过不建议从上下载,版本已有近2年没有更新了,最好从上下载。下载编译配置和使用过程都很简单。

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

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

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

图片[8]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

怎么看见里面图中的疗效呢?将examples、xhprof_html、xhprof_lib三个目录放在浏览器能访问到的地方,例如localhost的主目录内。更改examples/sample.php中的换成如:localhost/xhprof_html/。即可。

之后访问即可以得到输出结果如下:

图片[9]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

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

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 '

' . 'Profiler output

'; } }

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

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

例如:

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

运行后,得到如下疗效:

图片[10]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

但是每一个页面,都有这样的输出。点击「Profileroutput」即得到了报表。

图片[11]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

须要注意的是,在线上,如上使用XHProf要谨慎,虽然打开,也要有限制条件地打开,例如当前用户是个别调试开发者用户时才打开。否则,普通用户听到这样的输出,则不明所以,给用户带来困扰,其实,我们也可以不输出,而将数据直接储存,在后台系统中查看,这样用户就体会不到了。有一个工具,可以完全去除那些郁闷。那就是OneAPM,在第四部份我们再介绍。

SocketLog

作为程序员,不仅新功能开发之外,最常见的一个工作就是查错,尤其是远程用户的查错,还是一个很苦闷的过程。当前又加上了陌陌开发,API开发等操作。对于陌陌内、API由远程用户所调用的时侯,情况多变,查错也愈发地麻烦。这个时侯,我们的第三个利器登场了。那就是SocketLog。

SocketLog是国外著名PHP开发者罗飞的作品,罗飞是ThinkPHP的核心开发者,也是优才大学全栈工程师主力讲师。历任三生社群CTO。SocketLog的github地址为:sql停留在安装程序文件,在项目的主页上,详尽地介绍了用法和所用的技术。这儿简单地汇总讲解一下。

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

第二步是须要启动Socket服务,Socket服务是WebSocket合同的,初期版本是PHP编撰的服务器,新的版本早已使用Node.js来实现了。启动方式很简单,步入解压后的目录。

执行nodeserver/index.js即可。

安装好插件以后,就在Chrome上见到如右图标。蓝色表示没有联接上。

同时启动了服务器,做好设置,都会听到图标弄成红色了。

图片[12]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

须要注意的是,虽然我们这儿窃听地址配置成了本地地址,虽然也可以配置远程地址。不过远程地址的话记得打开服务器上的防火墙,由于通常1229端口在防火墙中是关掉的。

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

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

图片[13]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

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

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

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

图片[14]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

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

SocketLog的功能看上去似乎简单,而且却十分有用、好用,是不可多得的开发利器。有关SocketLog的更多介绍和使用说明,建议如今就立即下载,但是步入github主页好好地研究吧!

OneAPM

从前面的使用来看,SocketLog和XHProf都有两个不足之处,一是须要埋代码,二是只是基于单独一个页面会话的。而OneAPM相对来讲,就更强悍了,可以理解为云端SaaS版的XHProf和更强悍的SocketLog。不过有着更为强悍的优势。例如:

OneAPM的PHP探针,安装完成以后,并不须要在代码中埋入任何代码。

在数据搜集的过程中,不须要开发和运维的参与sql停留在安装程序文件,探针全手动搜集,并递交到远程服务器。

因为数据累积,所以支持历史报表,以及比XHProf和SocketLog更丰富的功能。

PHP只是OneAPM所支持的一种语言,它可以支持多种语言,HTML5、iOS、Android、Java、.NET、python、Node.js、PHP、ruby等。

OneAPM的安装过程也比较简单,不过因为是SaaS服务,所以得上官网注册一个帐号。登陆了以后,在应用程序里,点击添加,再选中PHP,就步入了安装探针的说明。

图片[15]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

分为如下几步:

1.获取授权编号

OneAPM授权账簿,用于配置和身分辨识。

2.下载OneAPMPHPagent安装程序

3.解压OneAPMPHPAgent

tar -xzf OneAPM_php_Agent_2.3.11.tar.gz  

4.安装OneAPMPHPAgent

cd oneapm-php5-linux-install-script  

sudo ./oneapm-install install  

5.输入LicenseKey

请点击步骤1中的「生成授权编号按键」成功安装,界面如下:

图片[16]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

OneAPM is now installed on your system. Congratulations!  

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

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

运行以下指令来启动Daemon

sudo /usr/bin/oneapm-daemon  

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

6.静待5分钟,开启OneAPM之旅

静待5分钟,等待应用程序向OneAPM发送应用程序性能数据,即可开始使用OneAPM应用性能管理。

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

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

图片[17]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

从前面这个图,我们看见响应时间,慢的达到了600ms以上,那是哪些造成的呢?我们可以分别查看:

图片[18]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[19]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[20]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

下边我们再来看看三个细化一层的报表,在Web事务统计中,虽然平均数很低,而且也列举了响应时间最长的5个恳求。如下:

图片[21]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

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

图片[22]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[23]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

例如前面的bind.php,果真最慢的是从网路上获取数据。也就是说,第三方登陆时,从第三方网站取数据花了绝大部分时间。去查看详情,OneAPM称为慢事务追踪,拉到页面的最顶部能够看见。

图片[24]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

图片[25]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

在后台报表中,我们同样也能见到是什么SQL句子慢。例如如下是bind.php中慢的SQL句子。

图片[26]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

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

图片[27]-做Web开发更是苦逼的活,不像是做iOS,搞定客户端,基本上就万事大吉了-唐朝资源网

所以无论从功能之强悍,还是易用之便捷,OneAPM不愧是商业化的SaaS服务,比XHProf胜去了不少。在笔者的项目中,早已大量使用。并取得了好的疗效。

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

© 版权声明
THE END
喜欢就支持一下吧
点赞247赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容