关于php:八年phper的高级工程师面试之路转载

40次阅读

共计 4302 个字符,预计需要花费 11 分钟才能阅读完成。

这是一篇反面教材,心愿也能引起局部程序员的警觉。

最近半个月工夫,通过几次面试,差不多曾经对本人有了定位————间隔腾讯 T3 岗位还是有一点间隔。

因为在一家小公司呆的习惯了(6 年),公司没有人在技术层面超过我,作为技术外围,感觉本人很牛,活在一个小圈子外面,简直不会被动去理解新技术,甚至对 php 以及 js 自身都不能算精通。

所以变故呈现的时候,我才发现自己的技术脱节有多厉害,尽管之前的面试并没有做专门的筹备,然而与 6 年前找工作的情景相比,差距十分的大。

上面是我整顿的一部分遇到的面试题,我尽量用我所晓得的常识来进行陈说,必定会有很多误会以及脱漏,心愿大家可能斧正。

公司 1:

1、mysql_real_escape_string mysql_escape_string 有什么实质的区别,有什么用途,为什么被弃用?

答:mysql_real_escape_string 须要事后连贯数据库,并可在第二个参数传入数据库连贯(不填则应用上一个连贯)

两者都是对数据库插入数据进行本义,然而 mysql_real_escape_string 本义时,会思考数据库连贯的字符集。

它们的用途都是用来能让数据失常插入到数据库中,并避免 sql 注入,然而并不能做到 100% 避免 sql 注入。

再问:为什么不能 100% 避免?

答;因为客户端编码以及服务器端编码不同,可能产生注入问题,然而其实这种场景不多见。

持续答:被弃用的起因是官网不再倡议应用 mysql_xx 的数据库操作形式,倡议应用 pdo 和 mysqli,因为不论从性能跟平安来看,mysqli 都比 mysql 要好。

衍生进去的问题是 mysqli 的连贯复用(长久化)问题,这一块我并没有答好。

2、什么是内存透露,js 内存透露是怎么产生的?

答:内存透露是因为一块被分配内存既不能被应用,也不能被回收,直到浏览器过程完结。

产生透露的起因是闭包维持函数内局部变量,不能被开释,尤其是应用闭包并存在内部援用还 setInterval 的时候危害很大。

备注:我感觉这块答复并不好,因为必定不是闭包的起因。

我查了一下材料,从比拟浅的方位来再答复一下这个问题:

产生透露的起因有好几种:

(1) 页面元素被删除,然而绑定在该元素上的事件未被删除;

(2) 闭包维持函数内局部变量(内部不可控),使其得不到开释;

(3) 意外的全局变量;

(4) 援用被删除,然而援用内的援用,还存在内存中。

从上述起因上看,内存透露产生的根本原因是援用无奈正确回收,值类型并不能引发内存透露。

对于每个援用,都有本人的援用计数,当援用计数归零或被标记革除时,js 垃圾回收器会认为该援用能够回收了。

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

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

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

持续答:跟原型链没有什么关联,函数的原型(prototype)次要用于实现继承,原型链可用于追溯继承关系,与作用域链相似,都是向上逐级拜访属性,直到被找到,原型链的顶层是 null,能够了解为所有的 object 都继承至 null,所以 null 的类型是 object。

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

4、一台电脑配置有限好,能够同时关上多少个网页

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

5、ip 地址能被伪造吗?

答:http 头部能够被篡改,然而只能批改 X_FORWARDED_FOR,实在 ip 地址(REMOTE_ADDR)很难批改(除非是路由器去批改),因为实在 ip 是底层会话 ip 地址,而且因为 TCP 3 次握手的存在,连贯无奈建设,伪造的意义不大,至于 UDP 的话,个别是内网才应用 UDP 通信。

6、有 100 万个奖品,每个人能够中奖 3 次,先到先得,怎么管制并发,不能发超,并保障齐全的先到先得模式

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

再问:事后插入须要很多资源,如果奖品数量上了 1 亿怎么办?

答:应用 redis 队列存储申请,跑守护过程异步发奖,产生的问题是用户无奈实时看到中奖状况。

再问:这样必定不行。

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

再问:内存比拟贵重,在不必内存加锁的状况下怎么办,并且如果碰到 1 亿奖池的状况,事后插入数据库必定不好,怎么办?

答:设置奖品概率,分三张表,都应用 innodb 引擎,一张存中奖记录(事后插入一行),一张存奖品发放详情,一张存用户抽奖状况(uin 惟一索引),大并发状况下,利用 mysql 的排他锁进行并发管制。流程如下:

begin

查问用户抽奖次数,加排他锁

对用户抽奖次数的更新 / 插入

锁行查问发放状况

取得抽奖后果(某些奖品发完之后,动静变更概率)

更新发放表

插入中奖记录

commit

再问:遇到脏读怎么办?

答:这方面不是很理解

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

答:不晓得

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

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

备注:答个 crc 校验就行了。

8、b+ 树的查问工夫复杂度是多少,哈希表是多少,为什么数据库索引用 b + 树存储,而不是哈希表,数据库索引存储还有其余数据结构吗?

答:O(log(n)),O(1)

因为哈希表是散列的,在遇到key>’12’ 这种查找条件时,不起作用,并且空间复杂度较高。

备注:b+ 数依据层数决定工夫复杂度,数据量多的状况下个别 4 - 5 层,而后用二分法查找页中的数据,工夫复杂度远小于 log(n)。

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

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

10、php 的垃圾回收机制?

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

ZEND 引擎保护了一个栈 zval,每个创立的变量和资源都会压入这个栈中,每个压入的数组构造都相似:[refcount => int, is_ref => 0|1, value => union, type => string],变量被 unset 时,ref_count 如果变成 0,则被回收。

当遇到变量循环援用本身时,应用同步回收算法回收。

备注:PHP7 曾经重写了 zal 的构造体。

11、jquery 的 sizzle 引擎工作原理

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

12、seajs 的工作原理,如何解决反复加载库的问题,如何进行资源的同步加载

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

13、memcache 跟 redis 的区别

答:可存储数据结构不同;redis 反对长久化存储。

14、md5 逆向原理

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

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

答:没有了。

备注:嗯,事实上也的确没有特地好的方法,只能应用 TB 级的海量特色库用数据库存起来,然再分片查找。

15、父类办法是 protected,子类重构为 private,会产生什么?

答:会产生 fatal 谬误,因为继承的办法或属性只能维持或放大权限,不能放大,比方 protected 重载为 public 是可行的。

16、一个网页从输出地址回车,到残缺展现网页内容这段时间里,做了哪些工作,越具体越好。

答:

0、浏览器本地缓存匹配;

1、本地 hosts 映射比照;

2、本地 dns 缓存解析;

3、近程 dns 解析取得服务器 ip 地址;

4、浏览器发送 tcp 连贯申请包(syn);

5、申请包通过传输层、网络层、数据链路层封装通过网卡达到路由器;

6、路由器转发数据包到所属运营商服务器;

7、运营商服务器通过寻址最短门路通过中继节点达到指定 ip 地址;

8、服务器端可能存在反向代理或者负载平衡,都是间接转发申请至上游服务器,当然也能够制订平安进攻规定间接抛弃申请包;

9、上游服务器收到连贯申请,在本身可用的状况下,返回(syn+ack);

10、浏览器校验 ack,再次发送(syn+ack);

11、服务器校验 ack 切换连贯状态至 established,而后依据申请传输数据包;

12、当 transform-encoding 为 chunked 时,浏览器开始渲染页面;

13、四次挥手,连贯敞开;

14、渲染数据实现。

备注:还有很多货色不懂,一些货色齐全是本人瞎蒙的,因为工夫起因,当前有工夫具体画一下。

17、keep-alive 的概念

答:长连贯机制,示意 keep-alive-timeout 工夫内,如果连贯没有 closed,再次传输数据不再须要三次握手了。

备注:这里也有很多疑难,须要好好捋一捋。

18、linux 文件压缩操作命令,shell 脚本等

备注:因为平时开发都是在 windows 环境,对 linux 理解有余,这一块简直是 0 分。

公司 2:

这个是被鄙视最惨的一家了,首先会有口试,相对来说并不简单,然而有些坑,很多曾经遗记了。

印象粗浅的是我说本人相熟罕用设计模式,而后让我画 UML 类图,我就懵逼了,所以在写简历的时候,最好是写本人十分相熟的,如果只是只知其一; 不知其二,并没有必要放到简历中。

公司 3:

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

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

2、myisam 跟 innodb 有什么区别;

3、php 过程死锁产生的起因是什么?怎么主动排查与主动复原?

4、有 class A {public function b($a, $b, $c){}};

怎么应用[‘b’ => 2, ‘a’ => 1, ‘c’ => 3],对进行 A::b 进行调用,并顺利赋值?

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

6、画一个 tcp 三次握手图

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


注:本文为转载
八年 phper 的高级工程师面试之路

正文完
 0