做程序员是一份辛苦的工作。周六早早起床在技术组打招呼。见没人回应,我说,“我猜我没醒”,然后一个哥们扔过来,“我在加班”!做web开发是个苦差事,不像做iOS,拿到client,基本上就万事大吉了。做web开发不仅仅是做后端,前端也是需要了解和熟悉的!做一个前后端兼顾的DevOps全栈工程师,绝对是最难的工作。不仅要会开发,还要懂运维和优化。不会运维的工程师绝对不是好架构师!不过庆幸的是,一个优秀的工程师虽然很忙,尽管需要熟悉前端、熟悉系统、熟悉运维、熟悉优化,但他的工具箱里有很多工具可以让这一生变得不那么艰难。.这里有四个让我们的DevOps生活更美好的神器。它们分别是Xdebug、XHProf、OneAPM和SocketLog。作为一名开发人员,Xdebug睡得最舒服的是了解你编写的代码,无论是从功能层面还是性能层面。而做WebPHP开发,比较棘手的事情之一就是代码调试。作为一种脚本语言,它运行在远程服务器端,客户端生成所有的HTML代码。一般认为我们无法准确调试运行情况,更不用说单步调试、变量监控等东西了。其实,这是一种误解。有一个PHP扩展Xdebug可以让我们方便地调试在远程服务器上运行的代码。方法很简单,从Xdebug下载最新版本的源码。wget解压:tar–zxvfxdebug-2.3.3.tgzcdxdebug-2.3.3phpize./configure–with-php-config=/usr/bin/php-configmakemakeinstall然后在php.ini中加入相应的配置,你需要注意的有两点:1.xdebug是zend_extension2。默认端口为9000,与php-fpm默认端口冲突,所以这里使用9100[xdebug]zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.soxdebug。remote_enable=onxdebug.remote_handler=dbgpxdebug.remote_host=localhostxdebug.remote_port=9100这样就安装好了,就是这么简单,下面我们就可以开始使用了。以ThinkPHP应用开发为例。ThinkPHP是典型的单入口应用,调用层次比较复杂。所以理解调用栈还是挺麻烦的。如果想获取某行的调用栈,可以使用PHP自带的debug_backtrace函数获取,但是不太直观,只是返回一个数组。而Xdebug可以将这一切可视化。配合Xdebug使用Netbeans自带的调试工具。首先通过第一项修改PHP调试的端口,从9000改为9100,其他不要改。注意这里选择了stopatthefirstline,这会在调试时PHP程序运行到PHP代码的第一行时停止,在ThinkPHP中,即在入口文件index.php的第一行停止。在这个例子中,作者做了一个汽车租赁管理系统的例子,项目名称为zuches。在http://localhost/zuches可以访问的地方部署代码,index文件为index.php。由于index.php是入口文件,所以在index.php上右击,选择debug。然后Netbeans自动打开如下地址进入调试状态:http://localhost/zuches/index.php?XDEBUG_SESSION_START=netbeans-xdebug同时运行位置指示器停留在index.php的***行.如下:点击继续运行,由于在IndexController.class.php的index方法中添加了断点,所以位置指示再次停留在对应的断点处。这时候我们可以查看中断时的调用栈和变量。每个定位到的类和对应的方法都可以通过栈轻松定位到。各种变量,无论是局部变量还是实例属性,无论是cookie还是提交的数据,在变量表中一目了然。简而言之,Xdebug让我们即使在做服务器端页面和API开发时,也可以像桌面应用程序开发一样调试每一行代码。Xdebug除了用于单步调试,还可以收集requests中的执行日志,记录每个函数的执行过程。这些日志可以用wincachegrind等工具进行分析,可以看到函数的调用栈和耗时。这里就不细说了,也不是很推荐,因为XHProf在这方面要轻量很多,功能也更强大,不需要你那么费力的去下载和分析日志。#p#XHProf上文提到,对于PHP中的函数调用栈和性能分析,XHProf继承和发展了Xdebug的开山之作。XHProf也是一个PHP扩展,但是不建议从http://pecl.php.net/package/xhprof下载,版本已经将近2年没有更新了,***来自https://github。com/phacility/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/例如。就是这样。然后访问http://localhost/examples/sample.php得到输出结果如下:从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''.'Profileroutput
';}}在这个封装类中,首先检查xhprof_enable函数是否存在,可以用来判断xhprof扩展是否安装配置成功,然后设置参数。特别值得一提的是函数register_shutdown_function用来注册一个操作,这个操作会在页面结束前自动执行运行。这样在分析页面性能时,只需要在ThinkPHP应用的index.php中添加两行,例如:require_once"xhprof.php";XHProf::init("zuches");run之后,得到如下效果:并且每个页面有这样的输出,点击“Profileroutput”可以得到报告,在这个例子中可以看出集成最好的方法运行时间在2S以上,值得关注和优化。从报告中可以看出,你可以先看到每个方法或函数的次数tion被调用,运行时间,可以分层点击查看父子层级的调用关系。需要注意的是,在线使用XHProf时,一定要谨慎使用XHProf。就算打开,也要有限制的打开。比如只有当前用户是调试开发者用户时才打开。否则普通用户看到这样的输出是不会理解的,给用户带来困惑。当然,我们也可以不输出,直接存储数据,在后台系统查看,这样用户就感觉不到了。有一种工具可以完全消除这些缠结。那就是OneAPM,我们会在第四部分介绍。#p#SocketLog作为一名程序员,除了新功能开发之外,最常见的工作之一就是检查错误,尤其是对于远程用户来说,这仍然是一个非常痛苦的过程。目前已增加微信开发、API开发等操作。对于微信,当API被远程用户调用时,情况多变,排查问题就更麻烦了。这时,我们的第三神器登场了。那就是SocketLog。SocketLog是国内知名PHP开发者罗飞的作品。罗飞是ThinkPHP的核心开发者,也是优才学院全栈工程师的主要讲师。现任三生制药社区CTO。SocketLog的github地址为:https://github.com/luofei614/SocketLog。在项目主页上,详细介绍了用法和使用的技术。这是一个简短的总结。SocketLog的使用主要分为三个步骤。第一步是安装Chrome插件。可以从github下载安装包安装,也可以从Chrome应用商店下载。第二步是启动Socket服务。Socket服务基于WebSocket协议。早期版本是用PHP编写的服务器,新版本已经使用Node.js实现。启动方法很简单,进入解压后的目录即可。只需执行nodeserver/index.js。安装插件后,您将在Chrome上看到以下图标。灰色表示未连接。同时启动服务器并进行设置,你会看到图标变成了蓝色。需要注意的是,虽然这里监听地址配置为本地地址,但也可以配置远程地址。不过要记得给远程地址打开服务器上的防火墙,因为1229端口在防火墙里一般是关闭的。SocketLog的原理是在服务器端向WebSocket服务器写入数据,作为客户端的Chrome插件,可以接收到数据。因此,无论是远程API调用还是网页访问,只要在程序中向WebSocket服务端写入数据,只要监听WebSocket服务的客户端都能收到相应的调试日志。第三步,埋码。使用方法也很简单。比如我们在上面ThinkPHP的index.php中添加两行代码。您将看到以下输出。然后我们在其他终端上也访问本机的这个页面地址,看看能不能得到输出?一开始没有输出效果。因为默认情况下,普通用户调用的slog是不记录的。将此行添加到slog上面的语句中,就可以了。slog(array('force_client_id'=>'test'),'set_config');此插件的测试用户,收到所有slog消息。如下图所示:并且这种输出无论是其他用户触发还是后台服务程序都可以输出。因此,开发者可以在自己的机器上收集自己想要收集的用户触发的调试信息,非常方便。然后为了体现对SQL语句的监控。我们在ThinkPHP/Library/Think/Db/Driver.class.php的1139行添加slog($str),然后访问该页面,得到如下输出,说明已经实现了对SQL日志的监控。SocketLog的功能虽然看起来简单,但是非常好用,简单易用,是一款优秀的开发神器。更多SocketLog的介绍和使用说明,推荐现在下载,到github主页学习!#p#OneAPM从上面的用法来看,SocketLog和XHProf都有两个缺点。一是他们需要埋点代码,二是他们只基于单页session。相对来说,OneAPM更强大,可以理解为XHProf的云SaaS版本和更强大的SocketLog。但是它有更强大的优势。例如:OneAPM的PHP探针,安装完成后,不需要在代码中嵌入任何代码。在数据采集过程中,无需开发和运维的参与,自动采集探针并提交到远程服务器。由于数据积累,支持历史报表,功能比XHProf和SocketLog多。PHP只是OneAPM支持的一种语言,它可以支持多种语言,HTML5、iOS、Android、Java、.NET、python、Node.js、PHP、ruby等。OneAPM的安装过程也比较简单,但是由于它是一个SaaS服务,你必须在官网注册一个账号。登录后,在应用程序中,点击添加,然后选择PHP,进入安装探针的说明。分为以下几个步骤:1.获取授权号OneAPM授权证书进行配置和识别。2.下载OneAPMPHPagent安装包3.解压OneAPMPHPAgenttar-xzfOneAPM_php_Agent_2.3.11.tar.gz4.安装OneAPMPHPAgent找到安装包所在文件夹路径cdoneapm-php5-linux-install-script执行安装命令sudo./oneapm-installinstall5.输入LicenseKey,点击步骤1中的“GenerateAuthorizationNumberbutton”安装成功,界面如下:如果出现如下信息,则表示安装成功是成功的。OneAPM现已安装在您的系统上。恭喜!当页面出现如下提示时,启动Daemon,然后在/usr/bin/oneapm-daemon中启动php-agent运行以下命令启动Daemonsudo/usr/bin/oneapm-daemonRestartApacheorThewebscheduleryouuse"如php-fpm》6.等待5分钟,开启OneAPM之旅等待5分钟,等待应用将应用性能数据发送至OneAPM,即可开始使用OneAPM应用性能管理。OneAPM收集的数据非常丰富。将收集到的响应时间数据分成四大块:Web事务,即页面业务逻辑本身的数据库,数据库连接和数据读取错误统计,并对各类错误进行分类统计。外部服务,即外部API以笔者站点为例,12小时数据如下:从上图可以看出,响应时间慢到600ms以上。是什么原因造成的?我们可以分别查看:可以看出web事务比较稳定,可以明显看出平均响应时间在50ms-75ms之间。数据库响应时间也很短,在几毫秒的数量级。对外服务明显是几百ms的水平,有的高达600ms。别的不说,就通过这个简单的报表,从目前的角度,可以定位,如果要优化,从对外服务的响应时间开始优化,效果是最好的。接下来,我们就来看看三份详细的报告。在Web事务统计中,虽然平均数很低,但也列出了响应时间最长的5个请求。如下:从上面的数据可以看出,响应时间最长的主要在bind.php,它负责QQ登录请求,需要向腾讯请求数据。在数据库列中,您可以看到最慢的5个表。外部服务中,不出所料,微博、微信、QQ登录、七牛上传、支付宝通知等外部服务耗时最长。如下所示。这只是一份普通的统计报告。对于具体的慢页面,有更详细的调用分析。比如上面的bind.php,最慢的就是从网络获取数据。换句话说,当第三方登录时,大部分时间都需要从第三方网站获取数据。查细节,有两个缺点,一是代码需要埋点,二是只是基于单页session。而OneAPM称为慢事务跟踪,可以在页面顶部看到。在后台报告中,我们还可以看到哪些SQL语句比较慢。比如下面是bind.php中的慢SQL语句。更重要的是,还有所有错误信息的集合,同样一目了然。因此,无论是功能强大还是使用方便,都存在两个缺点。一是它需要埋点代码,二是它只是基于单页session。而且OneAPM确实是一个商业化的SaaS服务,比XHProf好很多。在笔者的项目中,被大量使用。并取得了很好的效果。以上四个项目让我们对自己写的代码更有信心,无论是执行过程还是调优过程,我们都有十足的信心。我特意对比整理了这四款神器。希望他们能够改善每一个PHP开发者的生活,让我们的PHP开发变得不那么困难!