January 2011 Archives

身为一名初级程序员----最近我又将对自己的认可程度降低了、原因是最近加入了一些开源项目组,越发感到自己技术水平低下----今天有幸做了一套《PHP高级工程师面试题》,这里和大家一起分享一下。

1、HTTP协议中几个状态码的含义:503、500、401、200、301、302:

误解:对于HTTP返回代码,我只知道200、404、301、302这四个,而5XX印象中是错误返回,但无法具体到503是何种错误,401因为和404很接近、因而也可能是文件不存在之类的错误。

正解:查阅RFC2616,返回码共分5类、41种状态,1XX已经作废了、2XX为成功、3XX为转向、4XX是客户端错误、5XX是服务器错误。

具体到这道题,503是由于服务器负载过高导致服务暂停、500是服务端程序产生异常而终止、401是客户端验证失败、200是成功读取页面并加载、301是永久转向、302是临时转向。

2、PHP和MySQL中几个版本的进化史,比如MySQL4.0到4.1,PHP 4.x到5.1的重大改进等等:

误解:MySQL4.0到4.1的改变我不清楚,只有印象中MySQL5开始支持存储过程等SqlServer中才有的特性;PHP5开始才使得PHP语言拥有了真正的OOP特性。

正解:在MySQL官方的版本更新日志中查阅,找到了Changes in MySQL 4.1.0,其中一上来就提到了Incompatible Change:TIMESTAMP返回的是以YYYY-MM-DD HH:MM:SS为格式的字符串,而不定长时间戳不再被支持。之所以会有这个改变,是为了遵从标准SQL。

而MySQL5.0所增加的存储过程只是MySQL5.0所增加的若干新特性之一,并非重要改变。对于MySQL我始终了解的不多,正巧还没给自己的2011制定什么计划,现在初步打算2011将作为MySQL恶补年。

至于PHP的版本变化与改进,这个页面则罗列的非常详尽。具体到PHP5.1版本,是对OOP支持的更加完善、增加了类常量和静态成员。

3、PHP魔幻方法是什么:

误解:看到魔幻我就想到Magic,进而想到PHP中的魔术引用,就以为"魔幻方法"就是"魔术引用"的另一种中文译法。

正解:魔幻方法,是"方法"而不是"引用",其英文是Magic Methods,是一系列的以双下划线开头的函数集,这些函数名称是预定义的,作用类似构造函数和析构函数,但是它们的超集。

其中最常用的是构造函数和析构函数,除此之外还有12个魔幻方法,都可在某些条件满足时被自动调用。具体内容和实例代码可以从PHP官网的这个页面看到。

4、error_reporting等调试函数使用:

误解:我一直凭直觉认为error_reporting的报错组合有7种,原因是二进制的三位数只有001、010、011、100、101、110、111这七种组合。

正解:看过Predefined Constants这篇文章之后才知道我又犯了不求甚解的错了,PHP中共有16种报错级别,也就是说有大约65535种组合模式。

5、您是否用过版本控制软件?如果有您用的版本控制软件的名字是?

误解:我用过比较多的是SVN,除此之外在某些项目中还依然使用CVS,并且最近所关注的一款法国开源软件、和前段时间关注的生命百科,都是使用GIT获得源代码。

正解:这道题似乎并不难,但今天遇到的试题的设问是"根据经验说一下每个版本控制软件的特点"。对于版本控制软件,还真没让我觉得有什么特点。于是在网上找到三个版本控制软件、尽可能找到每一个的特点:

CVS:相对于SVN而言,CVS比较慢,由于架构实现的不同,SVN的确比CVS快很多。同时CVS将所有文件均视为文本文件。

SVN:能够识别不同的文件类型,进而区别对待文本文件与二进制文件。SVN不允许递交后滚回。

GIT:用于Linux内核开发的版本控制工具。与常用的版本控制工具CVS,Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。

6、MySQL的存储引擎MyISAM和innoDB的区别:

误解:对MySQL中的这两个引擎,我所认知的极限就是MyISAM是MySQL的默认引擎,具有良好的增加、查找性能,而在进行删除或修改操作时会有表级锁定、从而影响数据库性能;而innoDB并不存在MyISAM所表现出的问题,同时innoDB具有事务功能,可进行数据回溯。

正解:这里暂时没有什么正解,正解只有等到2011年----我的MySQL恶补年过后,再给出来了。

7、介绍xdebug、apc、eAccelerator、Xcache、Zend opt的使用经验:

误解:完全不了解。

正解:因为时间有限、在这个寂静的深夜,只有短短的3、5个小时时间,估计难以对上述几样东西有所了解。

8、请介绍Session的原理,大型网站中Session方面应注意什么?

误解:Session将客户端的变量经过序列化后存储在服务器上,并根据客户端Cookie进行标识,便于跨页面、跨域等操作时对变量和状态进行保留和读取。大型网站,应注意跨域问题、SESSION池溢出、SESSION有效期无效等问题。

正解:这道题是我所自认为答对了的一道题。但后来想了想,似乎仅仅答对了一半。对于大型网站而言,对待SESSION还要注意防止SESSION伪造、SESSION攻击等恶意用户。另外我没接触过太大的网站,因而这道题我将发给我的好友、征求一下他的意见。

9、测试PHP性能和MySQL数据库性能的工具,和找出瓶颈的方法。

误解:一直用AB对PHP进行测试、找出PHP中最影响性能的代码;用观察MySQL日志地方法找出慢查询。

正解:说来真郁闷,曾经看过一篇老王写的《体验XHProf》,也在自己的电脑上安装并用过一段时间,但始终觉得罗嗦,所以就不再使用了。今天看来,AB测出来的虽然简洁、但根本不能算是PHP性能测试。

而MySQL使用的测试工具主要有The MySQL Benchmark Suite、MySQL super-smack、MyBench,但只有The MySQL Benchmark Suite是"性能测试工具",而"MySQL super-smack"和"MyBench"都是压测工具。我只用过MyBench,也就是说我到今天连MySQL性能测试是什么还没搞清楚。

10、正则提出一个网页中的所有链接。

误解:preg_match('/href="(.*?)"/', $ret, $HtmlCode);

正解:首先preg_match()中的参数位置错了,又错了,每次用到preg_match我保准都错,都要看一眼手册才能把三个参数的位置搞清楚。

其次,这个正则普适性太低了,未考虑的情况也很多,但对于正则,我只能依靠不断地查手册来写,很难凭空写出来。现在想着"href"的大小写要不敏感、等号前后可出现空格、双引号可被单引号取代或干脆没有引号,所以综合以上这几条并参考正则手册、重写如下:

preg_match_all('/\sHREF[\s\t\r\n]*=[\s\t\r\n]*[\'"]*(.*?)[\'"\s\>]/i', $HtmlCode, $ret);

这个规则似乎还不完善,但是想用正则写出100%完善的匹配来,恐怕会很长很长......所以这个在我看来已经算是完善的了。

11、介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。

误解:我的做法是找到dedecms的登录模块,用uc_client中的API来重新实现,并重写dedecms中所有验证登录的地方,都改用ucenter的API来完成验证。

正解:自认为没有错误,做过两个类似的功能,一个是将wikipedia整合到DZ中;还有一个是将UCHOME最新版和DZ未支持UCENTER版整合在一起,方法可能是会,但具体用语言描述出来有困难。

12、大型的论坛、新闻文章系统、SNS网站在性能优化上有什么区别?

误解:论坛我认为只有insert、select操作,所以可以讲页面静态化,而提交模块依然保持动态提交;新闻系统主要是select操作,所以就全部静态化;SNS社区中各类操作频繁,所以要先预测网站上活跃内容、将其放入内存表,再对不活跃内容进行存档操作。

正解:我的想法肯定是天真浪漫的,也肯定不是标准答案。毕竟没有接触过大型网站的优化,所以我的MySQL恶补之2011年,所要进行的任何尝试,都要以先随机产生百万条数据为前提。

13、一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。

误解:我写的代码:

<?php
function sub($m, $n) {
    if(!is_array($m)) {
        $m=range(1,$m);
    }
    $unluck_monkey=$n % count($m);
    unset($m[$unluck_monkey]);
    if(count($m)!=1) {
        $m=array_merge($m);
        $m=sub($m, $n);
    } else {
        return $m;
    }
}
$arr=range(1,10);
$n=3;
$out=sub($arr, $n);
print_r($out);
?>

正解:只看上面的代码运行结果,就知道已经是错了。太晚了,已经5:57了,我想先睡一觉,然后再把正确改码该出来,现在感觉写出这个程序的正确代码并不困难。但难的是拿到分数,原因在于无论代码正确与否,都用到了递归,而这道题目似乎是一道算法题,若果真是在考算法,那么递归的使用肯定拿不到分数。

14、vim的基本快捷键。

误解:给出了h、j、k、l四个快捷键,然后我又写出了dd,i,I,o等快捷键。

正解:再次仔细审题,发现题干中强调的是"基本快捷键",而非"快捷键"。于是翻阅VIM手册,并未找到base shortcuts相关章节,但看VIM启动后的help页面,发现其所强调快捷键只有上下左右和一个冒号。

这道题答错纯属画蛇添足导致,直接写出hjkl即可,刻意彰显反倒弄巧成拙。

15、css盒模型。

误解:不理解,没接触过,脑袋里闪现出的是那个用于展现margin、padding、border等布局图;

正解:看了百度文库一篇相关文章,原来还真是那个东西,只可惜不会用语言描述,而且答题的时候我写的就是不理解、不知道。


16、firefox,IE下的前端js/css调试工具。

误解:Firefox下用Firebug,IE下只有在IE8中用过其自带的调试工具。

正解:IE中用到的是IE Developer Toolsbar,此外还有很多不同的开发调试工具,而我只接触过FireBug,又是一道拿不到分数的题。



友情链接 自然乱卷的博客 IO Language 白卉子的个人博客 孟子叶的个人博客 于新博的个人博客 周文艺 S9600初级程序员论坛 又听小楼风雨声 尚宁的英文Blog Mr.Shang 歪西网-石景山地区门户 卡客族