盛大公司PHP面试题
无笔试。重点看问题
谈谈观察者模式是什么?主要应用。
答:类似会有一些server对象时刻侦听某个对象的一些动作。被监听的对象也会有这个server列表,或者提供添加列表的接口。促发条件根据需 求。触发的时候这个object对象会发送本身给这些server列表中的一个方法里,这样server也就会取得传过来的对象实现侦听。主要应用在插件 上的。
什么是索引?建立索引有什么规则?注意点?
答:类似一种目录表吧,dbms会实现读写,mysql在查询的时候,可以直接去查找这个目录表,就不会去扫描整个表了。有什么注意点嘛?首先我会 看这个表,如果他生来就注定写多读少,尽量避免建立很多索引,因为他也会占用时间,对吧!另外在建立的时候我也会尽量建立在数字字段上,或者类似用户名 上,这样做可能,在需求上作select时候不会有like或者其他计算在里面。也不要有!有的话,不要放在左值上。。。被打断!
其实我想问是放在查询语句,select什么什么where什么什么的什么地方?
答:哦,放在where后字段上。
Mysql有几种引擎?或者你经常使用哪几个?
答:innodB,myisam,temporary(当时愣是没读上来这个单词,就拼写了)
innodB和myisam有什么区别?temporary你经常用在什么地方。
答:一个是行锁,一个是表锁,这样并发程度也就不一样了。innodB有日志,然后就能现实事务保证,他也能实现外键功能。Myisam在查询上快 点。文件方面。Myisam放有三个文件,在同一的目录中,数据也会放在其中一个上。而innodB的数据是放在目录外的idata文件中。innodB 也能实现这个idata文件大小的配置,比如可以配置最大为1G,到了这个大小,mysql会自动生成另一个idata文件。Temporary我会用在 类似用户登录的session表上。
你有没有想过为什么innodB要把数据提到一个文件中了?而不是想myisam放在自己的文件中?
答:这个嘛。。。可能是为了什么查询方便吧?或者好做日志,事务吧?瞎扯中。。。
HTTP报文格式是什么样的?能大概叙述下么?
答:源地址ip与端口号,目标ip与端口号,协议类型。(只记得这三个。然后开始瞎扯!)额。。。还有什么了?请求数据,请求页面。。。。(面试官愕然!)被打断!
Tcp三次握手大概是怎么样的?
答:先Client发送连接请求报文给Server。Server收到后发送ack确认报文给Client。Client收到确认报文后再发送确认报文给Server。完成三次握手。
这三次握手报文大概是什么样的?
答:额。这个嘛。。。client自己生成一个请求序列号吧,然后在随机绑定一个端口号,发送。对方加一后ack过来。。。。此处省略n字!其实不太懂!扯着玩。被打断!
HTTP协议中传输报文可能被hacker窃取了,并且解密了。你该怎么做?
答:(日!二进制都给解密了!地球已经不能阻止他了!反正我个小菜是没办法了!)额,这个嘛,,,,没太考虑!我想在传输的时候就该把主要的数据加密了再传输吧,比如用户密码,用户名什么的,这样解密了也不要紧吧!至于怎么加密,用MD5就好了。
了解https协议么?说说看。
答:怎么说了,停留在书本知识,从来没实践过。是443对吧?额,,,是http的加密连接协议。安全,可靠。然后开始瞎扯。其实不太懂!被打断!
session和cookie有什么不同?
答:一个是client-server保持机制,一个是client保持机制。存放的地方也不同。。。被打断!
恩,好。这些基本的我想你都知道。说说看你对cookie安全方面有什么考虑?比如他在client端会被篡改,你怎么做?
答:这个嘛。。。首先密码和一些重要数据一定不能存。还有就是,把要存放的数据都加密了。比如用户id,用户名,角色什么的。。。被打断!
MD5是不可逆的,你把用户id加密了,怎么比配啊?
答:(其实我还真没吧id加密过!没办法硬着头皮往下说!)额,就匹配吧,在比对的时候,server也进行一次MD5加密,看是否相等就行了!
你对加密有什么心得?我们都知道MD5解密网站很多了?
答:额,重要数据,不要用简单的一次MD5加密就行了。比如说,用户密码,我们可以给每个用户一个随即6位的加密因子。做位处理后再做MD5运算,比如说相与相或什么的。
你说的密码因子就是类似密钥么?放在什么地方?
答:恩,差不多吧。放在用户表里,随机的6为字符,用户每次登陆完后系统会更新这个字段与实际的密码字段。我现在做系统就是这么做的。你想啊,在这中间,别人最可能拿到的就是我们加密后的密码字符。这时候其实很可能已经失效了!
那别人拿到了真正用户密码了?
答:这个问题我有想过,后来想想我感觉好像没办法了吧!(面试官和我一样犯过这样的傻啊,呵呵)
对nosql熟悉么?有用过么?
答:还行吧。大部分没太用过。不过memcache用过,很常见,也很容易使用。主要在DB类层做判断就行了,如果内存中已经有了这个键值对,直接 memcache_connect,然后get数据。不然就去查找mysql。你想啊,最终我们交互的数据肯定都要到这个DB类抽象层。其他的nosql 如果有需要,我会去看这方面的书!
你对memcache的命中率有跟踪过么?效率怎么样?
答:这个嘛。。。这个自己没有跟踪过哦,只看过一些大神的博客比较过他和redis。貌似redis效率更高些(答非所问!)
你接触过最大的数据量有多少?最多有服务器?
答:大几百万吧。是个社区。有11台服务器。
对于大数据访问效率你怎么处理?
答:首先看是否能搭建分布式环境,做主从数据库,读写分离。让replication进程实现master-slave同步。
然后再考虑分表。水平、垂直分表都行。用什么算法分表看具体业务。比如比较简单主键的奇偶性。还有分表上,我建议用mysql5.1版本以上的逻辑 分表功能模块,先安装partition,简单配置下,做不同磁盘的存储,减少I/O的读写(在一次日资企业面试中学到的,然后回来看看,果真牛逼)。
其实这个也没减少I/O读写的。(没敢反驳!以后要真成了同事,咱们在慢慢讨论也不迟。)一般我们做master与slave同步很好处理,假如你发现你的应用中master写压力很大,你需要做多个master来分解压力。你怎么实现他们之间的同步?
答:这个。。。我还真没做过多个master。没考虑过哦。。。
对于分表算法,你有什么心得?
答:最简单的主键奇偶性,主要还是看需求,甚至按年份,月份都可以。
这些算法你怎么实现查询定位到具体表?
答:恩,这个因为你所有的数据交互,都要交给类似DB类得抽象层,这里面我会写类似find,select的方法,对其传过来的表参数实现具体算法 规则上的变换。尽量不要让运行原生的sql语句。即使运行我也会提供类似可以完成替换数据表的特殊字符串,让DB类能够实现替换。比如很多框架会在sql 里面建议用户用类似大写的__TABLE__字符串。
接触过cdn么?
答:接触过,是买的人家cdn,前一家公司是个社区,pv很大。这个是必须要有。
你能大概画一个web架构图么?比如你们之前11台服务器怎么架构的。
答:(一边画一边讲)最前面的这个是cdn,接下来这个是负载均衡器。后面有多个web server,每个都用的是nginx接受请求,后端用代理apache做处理。其中有一个当掉,其他服务器也会正常服务。然后这几个是主mysql服务 器,后面这几个是slave。这个是图片服务器。
你web页面上怎么请求你的图片服务器资源?
答:我们这个是单独的图片服务器,用户上传图片的时候时候,数据表里的字段会放完整的路径名,这样就能请求这个图片服务器了。
你们怎么实现这个图片服务器的安全?比如这个服务器挂掉了。有备份服务器的话,你怎么实现同步?
答:凌晨2点。呵呵。
那只能实现时间段得备份吧!比如在某天凌晨2点之前服务器挂了,当天的图片除了cdn上会有临时存储,其他就没了?
答:这个嘛。。。恩,肯定的。那我也不能在每个请求做一次同步吧。这个嘛。。。省略n个字,又到扯着玩时候了。。。
对web server熟悉么?对linux熟悉么?对shell熟悉么?
答:(实践表明,对这个面试官,不懂不要瞎扯,会带你到沟里去!)apache还行吧,能配置。Nginx,弱一点,有需要我可以学习。Linux的话,不太在行,缺少实践经验,理论知识还行。shell命令都还记得。
你说你们现在的平台要做java到php转换。你们要接触java么?为什么要转换了?
答:不会接触java。两个系统是平行使用的,目前也不会取代这个系统。听说是ceo不满意目前的这个java外包系统。所以要改的。
CEO不满意?这个理由不充分哦?
答:这个嘛。。。这个我也不知道哦。就听说ceo不满意的。
你在这个系统中做什么?
答:省略n个字。
你对linux c熟悉么?linux shell脚本了?
答:linux c一点不会!linux shell脚本还行,不过缺少实践。