一直被大家津津乐道。在面试必须考核的能力中,我个人认为解决问题的能力排在第一位,比学习能力的优先级更高。解决问题的能力不仅可以看程序员的思维能力、应变能力、探索能力等,还可以看他的阅历。如果你解决问题的能力很差,你将无法通过面试。下面是一个例子,如果我执行一个PHP脚本,比如phptest.php,它应该返回一个字符串。但是执行后没有信息输出。这时候我怎么知道程序哪里错了呢?在这里,解决问题的能力可以分为8个等级,后期表达能力更强。Lv0查看PHP错误信息程序没有达到预期的效果,证明代码有误。查看PHP错误消息是第一步。如果错误信息被忽略,说明此人不适合专业的程序员岗位。在某些情况下,错误显示在php.ini配置中被关闭。需要修改php.ini打开报错信息,或者将报错信息导出到日志文件。这种情况下可以直接tailfphp_error.log看错误信息。得到报错信息后,可以直接定位到程序代码问题,或者谷歌/百度搜索解决问题。注意:打开错误显示的方法是将php.ini中的display_errors/display_startup_errors设置为Onphp.ini中的error_reporting,并在PHP代码中设置error_reporting(E_ALL)Lv1。php有多个版本或者php-cli和php-fpm加载不同配置中php有多个版本,通过哪个php知道是哪个PHP,或者加个绝对路径指定php版本。表示此PHPer已通过该级别50%的测试。还有一种情况是php-cli和php-fpm获取到的执行条件不一样。比如在web浏览器中执行是正确的,但是在cli中执行是错误的。这时候可能是两个环境加载的php.ini不一样造成的。使用php-i|grepphp.ini获取在cli下加载的php.ini。fpm下可以通过phpinfo()函数获取php.ini的绝对路径。lv2var_dump/die打印变量值信息单步调试这是程序调试常用的方法,也是最简单有效的解决问题的方法。更高级的方法是使用PHP的Trace类/日志类,花哨的可以在IDE工具中使用phpstorm+xdebug调试。Trace工具还可以分析脚本的耗时,优化PHP程序的性能。这三个测试都通过了,说明这个程序员已经具备了一个专业的PHP程序员应该具备的解决问题的能力。PHP程序员只要过了这个关卡,应对大部分情况就足够了,对中小网站毫无压力。Lv3使用strace工具跟踪程序执行strace可以用来查看系统调用的执行情况,使用stracephptest.php,或者strace-p进程ID。strace可以帮助你透过现象看本质,把握程序执行的过程。这种方法在大型网站和大公司中最常用。如果你不会strace,我只能在这里说声抱歉,我们不接受不会strace的PHPer。其实strace也是对程序员基础的考验。如果你不会操作系统,根本不懂底层,你肯定用不上strace。当然strace解决不了PHP代码中的死循环。比如你发现一个php-fpm进程的CPU是100%,strace可能解决不了。因为strace看的是系统调用,一般都是IO类型的操作。既然是IO密集型的,CPU肯定不会100%。lv4使用tcpdump工具分析网络通信过程tcpdump可以抓取网卡的数据通信过程,甚至可以抓取到数据内容。使用tcpdump看看网络通信过程是什么样的,什么时候发起TCPSYN3握手,什么时候发送FIN包,什么时候发送RST包。这是一项基本技能。如果你不懂tcpdump,就证明你没有解决网络问题的能力。Lv5统计函数调用耗时和成功率使用xhporf/xdebug导出PHP请求的调用过程,然后分析每个函数调用的过程和耗时。能够分析PHP程序的性能瓶颈,找出可以优化的点。另外调用网络服务,比如mysql查询,curl,其他API调用等,通过记录开始和结束的microtime,是否返回false,可以得到调用是否成功,耗时多少。如果能总结出数据,能够梳理出调用的成功率、失败率、平均延迟,就证明这个程序员对界面质量敏感,有大型网站项目的经验。在Lv6中使用gdbgdb是C/C++调试程序的强大工具。需要有一定C/C++技能的程序员才能熟练使用gdb。上面说的strace无法追踪到php程序的100%CPU,但是gdb可以追踪到。另外gdb还可以解决php程序的coredump问题。通过gdb-p进程ID,配合php-src的.gdbinitzbacktrace等工具,可以很方便的跟踪PHP程序的执行情况。像上面的CPU100%,在PHP程序中往往是死循环。用gdb多次查看后,大致可以得出死循环的位置。具有gdb解题能力的PHP程序员少之又少。如果能用gdb解决PHP问题,这个PHPer可以100%通过面试,获得更高的技术评分。Lv7查看PHP内核和扩展源码如果你熟悉PHP内核和扩展源码,你也能有能力解决PHP程序中最复杂的内存错误。这样的PHP程序员很少见。借助gdb工具,熟悉PHP源码,可以查看opcode信息,execute_data内存,全局变量状态等。转载自:http://rango.swoole.com/archi...
