【转载】八年phper的高级工程师面试之路

这是一篇反面教材,但愿也能引发部分程序员的警戒。php

最近半个月时间,通过几回面试,差很少已经对本身有了定位————距离腾讯T3岗位仍是有一点距离。mysql

由于在一家小公司呆的习惯了(6年),公司没有人在技术层面超过我,做为技术核心,感受本身很牛,活在一个小圈子里面,几乎不会主动去了解新技术,甚至对php以及js自己都不能算精通。jquery

因此变故出现的时候,我才发现本身的技术脱节有多厉害,虽然以前的面试并无作专门的准备,可是与6年前找工做的情形相比,差距很是的大。linux

下面是我整理的一部分遇到的面试题,我尽可能用我所知道的知识来进行陈述,确定会有不少误解以及遗漏,但愿你们可以指正。程序员

公司1:

一、mysql_real_escape_string mysql_escape_string有什么本质的区别,有什么用处,为何被弃用?

答:mysql_real_escape_string须要预先链接数据库,并可在第二个参数传入数据库链接(不填则使用上一个链接) 二者都是对数据库插入数据进行转义,可是mysql_real_escape_string转义时,会考虑数据库链接的字符集。 它们的用处都是用来能让数据正常插入到数据库中,并防止sql注入,可是并不能作到100%防止sql注入。面试

再问:为何不能100%防止?

答;由于客户端编码以及服务器端编码不一样,可能产生注入问题,可是其实这种场景很少见。redis

继续答:被弃用的缘由是官方再也不建议使用mysql_xx的数据库操做方式,建议使用pdo和mysqli,由于无论从性能跟安全来看,mysqli都比mysql要好。算法

衍生出来的问题是mysqli的链接复用(持久化)问题,这一块我并无答好。sql

二、什么是内存泄漏,js内存泄漏是怎么产生的?

答:内存泄漏是由于一块被分配内存既不能被使用,也不能被回收,直到浏览器进程结束。shell

产生泄漏的缘由是闭包维持函数内局部变量,不能被释放,尤为是使用闭包并存在外部引用还setInterval的时候危害很大。

  • 备注:我以为这块回答并很差,由于确定不是闭包的缘由。

我查了一下资料,从比较浅的方位来再回答一下这个问题: 产生泄漏的缘由有好几种: (1) 页面元素被删除,可是绑定在该元素上的事件未被删除; (2) 闭包维持函数内局部变量(外部不可控),使其得不到释放; (3) 意外的全局变量; (4) 引用被删除,可是引用内的引用,还存在内存中。 从上述缘由上看,内存泄漏产生的根本缘由是引用没法正确回收,值类型并不能引起内存泄漏。 对于每一个引用,都有本身的引用计数,当引用计数归零或被标记清除时,js垃圾回收器会认为该引用能够回收了。

三、什么是闭包,跟原型链、做用域链有什么关联

答:闭包是指存在于一个做用域链分支的函数域内的函数,该函数能够向上逐级访问做用域链上的变量,直到找到为止。当闭包存在外部引用时,js会维持闭包自身以及所在函数做用域链的内存状态。

  • 备注:这个是我本身瞎说的。

继续答:跟原型链没有什么关联,函数的原型(prototype)主要用于实现继承,原型链可用于追溯继承关系,与做用域链相似,都是向上逐级访问属性,直到被找到,原型链的顶层是null,能够理解为全部的object都继承至null,因此null的类型是object。

继续答:做用域链能够看做是一个树形结构,由根节点window向下扩散,下层节点能够访问上层节点,可是上层节点没法访问下层节点,产生闭包的函数做用域属于节点中的一个,向下扩散后闭包函数产生叶子节点,叶子节点之间能够互相访问,当访问的变量在叶子节点中没法找到时,向上层节点查找,直到被找到为止,这个概念有点相似原型链上的属性查找。

四、一台电脑配置无限好,能够同时打开多少个网页

答:65535-1000 = 64535(端口数)

五、ip地址能被伪造吗?

答:http头部能够被篡改,可是只能修改X_FORWARDED_FOR,真实ip地址(REMOTE_ADDR)很难修改(除非是路由器去修改),由于真实ip是底层会话ip地址,并且由于TCP 3次握手的存在,链接没法创建,伪造的意义不大,至于UDP的话,通常是内网才使用UDP通讯。

六、有100万个奖品,每一个人能够中奖3次,先到先得,怎么控制并发,不能发超,并保证彻底的先到先得模式

答:百万奖品在打乱后预先insert到数据库,全部中奖操做,均只能update,不能insert。进来抽奖的用户使用memcahe原子加锁,实现抽奖次数自增,当抽奖次数到达3时,返回不中奖。

再问:预先插入须要不少资源,若是奖品数量上了1亿怎么办?

答:使用redis队列存储请求,跑守护进程异步发奖,产生的问题是用户没法实时看到中奖状况。

再问:这样确定不行。

再答:使用全局内存加锁确保抽奖过程是单进程在跑,可是会面临大并发阻塞问题。

再问:内存比较宝贵,在不用内存加锁的状况下怎么办,而且若是碰到1亿奖池的状况,预先插入数据库确定很差,怎么办?

答:设置奖品几率,分三张表,都使用innodb引擎,一张存中奖记录(预先插入一行),一张存奖品发放概况,一张存用户抽奖状况(uin惟一索引),大并发状况下,利用mysql的排他锁进行并发控制。流程以下:

begin
查询用户抽奖次数,加排他锁
对用户抽奖次数的更新/插入
锁行查询发放状况
得到抽奖结果(某些奖品发完以后,动态变动几率)
更新发放表
插入中奖记录
commit
复制代码

再问:遇到脏读怎么办?

答:这方面不是很了解

再问:innodb的master线程在什么状况下fork其余子线程?

答:不知道

七、数据链路层的数据是怎么校验的,有哪些校验方式?

答:crc32,别的校验多是取模校验奇偶数吧。

  • 备注:答个crc校验就好了。

八、b+树的查询时间复杂度是多少,哈希表是多少,为何数据库索引用b+树存储,而不是哈希表,数据库索引存储还有其余数据结构吗?

答:O(log(n)),O(1) 由于哈希表是散列的,在遇到key>'12'这种查找条件时,不起做用,而且空间复杂度较高。

  • 备注:b+数根据层数决定时间复杂度,数据量多的状况下通常4-5层,而后用二分法查找页中的数据,时间复杂度远小于log(n)。

九、apache是怎么跟php通信的,sapi是什么

答:使用sapi通信,sapi是php封装的对外数据传递接口,一般有cgi/fastcgi/cli/apache2handler四种运行模式。

十、php的垃圾回收机制?

答:垃圾回收是指当php运行状态结束时,好比遇到了exit/die/致命错误/脚本运行结束时,php须要回收运行过程当中建立的变量、资源的内存。

ZEND引擎维护了一个栈zval,每一个建立的变量和资源都会压入这个栈中,每一个压入的数组结构都相似:[refcount => int, is_ref => 0|1, value => union, type => string],变量被unset时,ref_count若是变成0,则被回收。 当遇到变量循环引用自身时,使用同步回收算法回收。

  • 备注:PHP7已经重写了zal的结构体。

十一、jquery的sizzle引擎工做原理

答:除了直到是DOM元素查找引擎以外,一无所知。

十二、seajs的工做原理,如何解决重复加载库的问题,如何进行资源的同步加载

答:创建映射关系并缓存起来;资源并不能真正同步加载,只是返回一个回调。

1三、memcache跟redis的区别

答:可存储数据结构不一样;redis支持持久化存储。

1四、md5逆向原理

答:先用字典查找,再尝试暴力破解。

再问:没有更好的方法了吗?

答:没有了。 备注:嗯,事实上也确实没有特别好的办法,只能使用TB级的海量特征库用数据库存起来,然再分片查找。

1五、父类方法是protected,子类重构为private,会发生什么?

答:会发生fatal错误,由于继承的方法或属性只能维持或放大权限,不能缩小,好比protected重载为public是可行的。

1六、一个网页从输入地址回车,到完整展现网页内容这段时间里,作了哪些工做,越详细越好。

答: 0、浏览器本地缓存匹配; 一、本地hosts映射对比; 二、本地dns缓存解析; 三、远程dns解析得到服务器ip地址; 四、浏览器发送tcp链接请求包(syn); 五、请求包通过传输层、网络层、数据链路层封装经过网卡到达路由器; 六、路由器转发数据包到所属运营商服务器; 七、运营商服务器经过寻址最短路径经过中继节点到达指定ip地址; 八、服务器端可能存在反向代理或者负载均衡,都是直接转发请求至上游服务器,固然也能够制定安全防护规则直接丢弃请求包; 九、上游服务器收到链接请求,在自身可用的状况下,返回(syn+ack); 十、浏览器校验ack,再次发送(syn+ack); 十一、服务器校验ack切换链接状态至established,而后根据请求传输数据包; 十二、当transform-encoding为chunked时,浏览器开始渲染页面; 1三、四次挥手,链接关闭; 1四、渲染数据完成。

  • 备注:还有不少东西不懂,一些东西彻底是本身瞎蒙的,由于时间缘由,之后有时间详细画一下。

1七、keep-alive的概念

答:长链接机制,表示keep-alive-timeout时间内,若是链接没有closed,再次传输数据再也不须要三次握手了。

  • 备注:这里也有不少疑问,须要好好捋一捋。

1八、linux文件压缩操做命令,shell脚本等

备注:由于平时开发都是在windows环境,对linux了解不足,这一块几乎是0分。

公司2:

这个是被鄙视最惨的一家了,首先会有笔试,相对来讲并不复杂,可是有些坑,不少已经忘记了。

印象深入的是我说本身熟悉经常使用设计模式,而后让我画UML类图,我就懵逼了,因此在写简历的时候,最好是写本身很是熟悉的,若是只是只知其一;不知其二,并无必要放到简历中。

公司3:

这里仅列举几个问到的问题:

一、设计一个中继服务器,转发客户A->客户B的请求;

二、myisam跟innodb有什么区别;

三、php进程死锁产生的缘由是什么?怎么自动排查与自动恢复?

四、有class A { public function b($a, $b, $c){}};怎么使用['b' => 2, 'a' => 1, 'c' => 3],对进行A::b进行调用,并顺利赋值?

五、php5.2->php7.1的各版本演进历史,新增特性等?

六、画一个tcp三次握手图

目前还在找工做中,在我看来8年的程序员怎么也不该该是这样子的,温水煮青蛙的教训很是惨痛,好在如今认识到问题还不晚,等到了35岁这个年纪,可能就真的晚了。

转载知乎:辉哥

相关文章
相关标签/搜索