让PHP程序员工作更高效的四大神奇(1)
做 Web 开发更是一个苦逼的活,不像是做 iOS,搞定客户端,基本上就万事大吉了。做 Web 开发不仅仅是要做后端,前端也需要了解和熟悉!
做前后端通吃的 DevOps 全栈工程师绝对是最苦逼的活,不但需要做开发,而且还要了解运维、优化,不会运维的工程师绝对不是一个好架构师!
但所幸的事,一个优秀的工程师尽管很忙,尽管要熟悉前后端、系统、运营、优化,但是在他的工具箱里,放着一大堆工具,让这种生活变得不那么苦逼。
这里就介绍四个让我们 DevOps 生活变得美好的神器。分别是 Xdebug、XHProf 、 OneAPM 和 SocketLog。
Xdebug
作为开发人员,睡得最踏实的事是对自己写的代码了如指掌,无论是从功能层面,还是性能层面。而做 Web PHP 开发,比较棘手的一件事情就是代码的调试。作为脚本语言,在远程服务器端运行,客户端生成的全是 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 的第一行停止。
在本例中,笔者做了一个租车管理系统的示例,项目名为 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
在这块要轻量级和强大的多,不用如此费劲地下载日志,分析日志。