的话题,一直被大家津津乐道。在面试必须考核的能力中,我个人认为解决问题的能力排在第一位,比学习能力的优先级更高。解决问题的能力不仅可以看程序员的思维能力、应变能力、探索能力等,还可以看他的阅历。如果你解决问题的能力很差,你将无法通过面试。 这里举个例子,如果我执行一个PHP脚本,比如phptest.php,期望返回一个字符串。但是执行后没有信息输出。这时候我怎么知道程序哪里错了呢?在这里,解决问题的能力可以分为8个等级,后期表达能力更强。 Lv0查看PHP错误信息 程序没有达到预期的效果,证明代码有误。查看PHP错误消息是第一步。如果错误信息被忽略,说明此人不适合专业的程序员岗位。有些情况下php.ini配置中关闭了错误显示,需要修改php.ini打开错误信息,或者将错误信息导出到日志文件。这种情况下可以直接tailfphp_error.log看错误信息。 得到报错信息后,直接定位程序代码问题,或谷歌/百度搜索解决问题。 注意:打开错误显示的方法是将php.ini中的display_errors/display_startup_errors设置为On,将php.ini中的error_reporting设置为E_ALL,PHP代码中设置error_reporting(E_ALL)。 Lv1php或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,可以得到调用是否成功,多少需要的时间。如果能总结出数据,能够梳理出调用的成功率、失败率、平均延迟,就证明这个程序员对界面质量敏感,有大型网站项目的经验。 Lv6gdb使用 gdb是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***就可以通过面试,获得更高的技术评价。 Lv7查看PHP内核和扩展源码 如果您熟悉PHP内核和扩展源码,您也可以拥有解决PHP程序中最复杂的内存错误的能力。这样的PHP程序员很少见。借助gdb工具,熟悉PHP源码,可以查看opcode信息,execute_data内存,全局变量状态等。
