一个16年毕业生所经历的php面试

23,659 阅读18分钟

前言:有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连

有心的同学应该会看到我这个noteBook下面的其它知识,希望对你们有些许帮助。

本文地址

时间点:2017-11

一、什么是面试

说到面试,还是先说你为什么要离职,

关键字:成长、发展、委屈、领导、钱(工资)突发感想是不是可以抓取下然后分析关键字,哈哈哈

还有

还想看吗

我的理解:面试不是高考,高考只有一次(不说补习),面试可以有n次,只要有面试机会,你就可以一直去面,面到吐为止都没关系,不要怕失败,
公司没选择你不是你不优秀,而是你不符合他们的要求,回家思考下面试不足的地方,调整下心态,准备下个面试才是你正确的做法。

二、面试准备

准备是多方面的,俗话说:成功只留给有准备的人

1. 问:什么时候开始准备?

你是牛人吗 ? 不用准备,等猎头挖 : 老老实实的随时准备好

2. 问:怎么准备?

  • 项目经验是一部分:面试是离不开的,充分理解自己所做的那部分,能在面试中清楚的表述出自己做了什么,充当什么样的角色
  • 自己分享知识的地方:比如博客/github,自己总结的会比去看别人的总结效果好不只一丁半点
  • 基础知识:字符串操作、数组操作、文件操作、正则操作
  • 进阶知识:面向对象、数据结构和算法、设计模式、mysql索引、mysql引擎、mysql事务、mysql锁
  • 高阶知识:linux+nginx+mysql+php+redis 优化,只会操作没用,谁都会,高并发、分布式系统、负载均衡、分库分表、消息队列

三、面试干货

1、某教育机构两面

mysql事务是什么

我说了mysql的四个特性,原子性、一致性、隔离性、持久性,事务可以理解成一次操作要不完成要不失败。
面试官问了隔离性和锁的问题,有点忘了,这个真没答上来
-------------
可以参考下《Innodb中的事务隔离级别和锁的关系》https://tech.meituan.com/innodb-lock.html

php代码解释过程

我说了通过zend引擎解析成opcode,然后转化成机器识别的代码。
平时确实没有去关注这个,失败失败,查了资料
鸟哥写的《深入理解PHP原理之Opcodes》http://www.laruence.com/2008/06/18/221.html

百度统计的实现原理

我没答上来,自己后面查的
-------------
参考:http://blog.csdn.net/iqzq123/article/details/8877645

如何共享session

我说了通过redis存储session,以达到共享目的,后面查了下方案,还挺多的
-------------
参考:http://www.cnblogs.com/wangtao_20/p/3395518.html#commentform

git分支管理策略

我写了master作为主分支,dev作为开发分支,bug_fix分支作为bug分支
面试官说有个临时bug需要改,而我们在dev上已经开发了很多内容了,我答的是用bug_fix分支拉master代码,
再合回去,面试官说dev怎么办,改了相同的模块会冲突想了下,确实会,然后求教面试官,
面试官说可以用git rebase变基实现,自己见过这个命令,但是没用过,尴尬

restful设计

我说了get、post、put、patch、delete,面试官问他们分别怎么用,毕竟自己做api的
就回答了get是从服务器取资源、post是新建资源、put是
更新完整资源、patch更新部分资源、delete是删除资源,就过了

附加题:论坛的表设计

有点忘了,我答的不是很好,问的是有以下几个需求,请问需要建几张表,为什么?主要考的如何合理的设计表,
比如用户登录信息表可以怎样设计?发帖表和回帖表需要怎样设计?内容字段比较大,怎样设计更好?哪些字段需要加索引?

情景题:一个登录系统的改进

用伪代码实现
第一步:PC端只有两个表单框和注册按钮,后端接收参数,再存入数据库
第二步:添加移动端,需要发送短信
第三步:加入第三方登陆方式,需要发送邮件
第四步:有个兄弟公司,给了我们一张execl表,里面是用户信息,需要后台注册这些用户,如何修改现有的代码
第四步:有点忘了,好像是如何进一步优化

这里第三步就答不好了,考察的是逻辑能力和代码组织能力,设计模式的重要性。

自己最满意的代码

自己自由发挥,项目中遇到的应该是最好答的

了解哪些设计模式,实际用例

我的回答
工厂模式:定义一个标准,用到的类可以按这个标准实现相应功能
单例模式:防止重复实例化,减少资源调用
数据映射:数据库ORM应用
装饰器模式:兼容老数据,多态的应用

面试管问了怎么兼容老数据,考察codereview能力

困了,先到这里


2、某电商公司三人面

笔试题挺有意思的,比较能考察出我这样的面试者水平

笔试题的解法见php7.php文件中的24、25、26

将一个二维数组的值首字母大写

题目意思大概是这样的,印象不深很清了
当时做的时候好像做错了,现在想了下,思路是获取键值和值,然后双重循环转大写即可。

使用正则获取html里的href属性的值和a标签内的值,并以href值为key,a标签内的值为value存入二维数组中

大概是这样的结构,我简化了

<ul class="attr">
    <li>
        <a href="www.baidu.com">百度baidu</a>
        <a href='www.tecent.com'>腾讯tengxun</a>
        <a href="www.alibaba.com">阿里巴巴alibaba</a>
    </li>
</ul>

考察正则表达式的运用和数组的拼装,我当时做的稀烂,回去稍微看了下正则,就很容易了。

优化语句查询

test表中数据有500w,字段有id/t_id/type_id/plat_id,语句为select max(t_id) from test where type_id=1 and plat_id=1

考察mysql语句优化,这里主要是优化max函数,max函数会导致全表扫描,效率会很低,可以使用order by加limit进行优化

select t_id from test where type_id=1 and plat_id=1 order by t_id desc limit 1;
当然还可以使用加索引进一步优化速度,这里可以加上(type_id/plat_id)联合索引。
-------------
正确做法是给`t_id`加索引,还有(type_id/plat_id)联合索引,order by 并不能避免全表扫描。

找出N个数中的第M大的数

考察算法,貌似是查找?
我当时的想法是先对数组排序,然后索引的N-M的数就是M大的数

Ajax跨域请求时,会出现什么问题?如何解决

我的回答:稀烂,跨域出现问题会出现请求拒绝,是出于安全起见,设置Access-Control-Allow-Origin为*即可。哈哈哈naive
-------------
回去搜了下,方案还挺多的。
参考https://dailc.github.io/2017/03/22/ajaxCrossDomainSolution.html

如何优化一个CPU运算密集的网站

没有实践过对吧,没关系,会google吗?会背吗?脑子能留个大概的原理吗?

自己最满意的 代码

自己自由发挥,项目中遇到的应该是最好答的

其它

简历上的项目询问,项目中最有难度的地方?如何解决的?

困了,睡


3、某民宿杭州分公司一面

没有笔试题,纯面试题,很注重基础,比如操作系统

phpunit的用法

自己平时没注意这个东西,所以答的稀烂,问到有没有连数据库测,我说有,只是用预期数据与数据库查出的数据对比测试
面试官问有没有用过mock
懵逼了,这个概念确实听过,没去做过,意思是造假的意思,通过模拟数据库操作来达到测试目的,还有stub站桩,需要多实践啊骚年 o_o
-------------
参考:https://phpunit.de/manual/current/zh_cn/test-doubles.html

redis异步队列实现细节

看我简历中写用过

我当时用的是laravel中的队列机制,通过dispatch()触发任务,php artisan queue:work 开启后台进程监视队列并完成任务
面试官不满足,问我他的原理,怎样实现的?
我说用的是list,通过触发lpush入队,然后依次rpop出队处理任务
面试官说这是阻塞的,能不能有高效的做法,我说不清楚,面试官好像说可以把一个list的数据放到多个list中并行处理,zzz。

redis中zest如何根据两个属性排序,比如id和age

不知道,只知道根据score分值排序,有知道的同学可以留言
请自行google   redis zset 多字段排序
-------------
查了下,有说先自行排序后存入redis
https://segmentfault.com/q/1010000004669705

你对多进程和多线程还有协程的理解

作为cs专业的phper,大学学的都交给老师了,zzz

进程可以有多个线程,在php中yield可以实现协程,面试官问swoole新版本中自带协程,你怎么理解?
没研究过zzz
-------------
进程是正在运行的程序的实例
进程是内核分配资源的最基本的单元
线程是内核执行的最基本的单元
进程内可以包含多个线程
协程的话相当于语言自己实现一个函数调度
参考:http://www.cnblogs.com/lxmhhy/p/6041001.html

说说怎么理解现在前端框架中的组件化和模块化

看到我会react.js问的

我说就比如react里的组件可以理解为一个class类,模块的意思是一个文件就是一个模块,有单独的作用域
-------------
参考:http://xiaodongtongxue.top/2016/05/20/浅谈前端自动化%20工程化%20组件化%20模块化/

http协议中get和post的区别,怎么实现的

get是获取资源,post创建资源
get数据长度有限制,post无限制
get数据在url中安全性差,post不显示在url中更安全
怎么实现的,懵逼zzz
-------------
参考:https://zhuanlan.zhihu.com/p/22536382

最近在看什么书

送命题,没看过就老实说没看过好了,不然会xxxx,比如我说了看了《图解HTTP》,首先问了我上面那道题,然后说你看的书不够深入,我。。。。

4、某众筹杭州分公司三面

php使用什么mysql连接?

还以为很简单呢,直接说了mysqli和pdo,mysql弃用了
面试官来了句不是问这个,是问连接池
我对这个概念很懵,就回了是持久连接吗,可以用mysql_connect()
面试官再问比如laravel默认使用什么mysql连接的
我猜的是pdo吧
他说再想想
我xxxx,就这样过了
-------------
回去很郁闷的查了下,默认PDO,我还以为是想考察关于php编译时mysqlnd这样的呢
All database work in Laravel is done through the PHP PDO facilities
so make sure you have the driver for your particular database of
choice installed on your machine before you begin development.

场景题:索引的建立规则和explain

有这样一张表 自增id、名字、昵称、年龄、客户类型、创建时间

哪些字段需要建立索引?为什么?

我说年龄、创建时间、客户类型需要建立索引,where条件经常用到的字段
面试官说客户类型用的enum枚举呢,是不是也需要建立索引
我说不清楚
面试官说其实是不需要的,枚举类型只有几种,mysql查询时会分组查,一般写sql前可以用explain观察sql语句

你用的是php版本是哪个?为什么?php7有什么更新?

很幸运,自己一直用的是php7,因为php7速度有很大提升,也有很多新特性,比如标量类型声明、返回类型声明
命名空间、Trait、自动加载都是现代php所需要的
面试官问有自己发不过composer包吗?他的自动加载原理是怎么样的?
自己创建过composer包,没发布,自动加载是通过sql_autoload_register()实现的
面试官说之前都是include引入的对吧,你应该在往前想下
我xxxx
面试官说是当这个文件使用的时候,才会加载进来,以达到自动加载目的。

nginx相关

简历写了了解nginx负载均衡和反向代理,你是怎么做的

php-fpm能代理其他端口吗?除了默认9000

nginx配置php-fpm的时候走的是什么协议?还可以走其他协议吗?

自己搭建的vps,负载均衡是通过多个端口实现的,反向代理是代理到apache
可以走其他端口,需要配置ini文件,走的http协议,其它协议,不知道
面试官说可以走tcp协议,比如socket

看你用过laravel和tp,比较下两款框架

tp是国人写的,理念比较陈旧过时
laravel是现在最火的php框架,开源社区活跃,工具也最多,运用了面向对象的思想和很多设计模式,是值得学习和运用的选择
laravel的源码看过吗?
看过,laravel的container容器,还有ioc控制反转、di依赖注入,通过server provider服务提供者bind绑定实例放入到容器内,
然后通过make解析容器中的某个实例,可以通过facade门面直接静态调用。
面试官说怎么兼容之前的版本,比如像app那样,既发布了新的版本,老版本也需要兼容。
我没做过,我的想法是一通过适配器模式,达到兼容两者的需求,二可以使用dingo/api多版本控制

你未来的发展规划,1年的,3年的

自由发挥,其实也蛮重要的,往积极方面答总没错,比如深入php、扩展技术栈

其他

简历上的项目询问,项目中最有难度的地方?如何解决的?

5、某旅游公司两面

套路真多,这面试官很有代入感

为什么离职

机智点,按你填表里写的离职理由答就行,别露馅了,哈哈哈。

如何选择PHP的?关于目前流行的Java比较?

这里机智点答就行,比较的话讲两者的使用场景,比如php适合web开发,java有多种选择,web和安卓

有没有系统的培训过?有没有看php相关的网络课程和书籍?

我以为是说我有没有去培训过,我当然说没了
我说的是慕课网的优秀课程和《Modern PHP》《PHP核心技术和最佳实践》《PHP the right way》

看你用过laravel和tp, 比较下两款框架

tp是国人写的,理念比较陈旧过时
laravel是现在最火的php框架,开源社区活跃,工具也最多,运用了面向对象的思想和很多设计模式,是值得学习和运用的选择
laravel的源码看过吗?
看过,laravel的container容器,还有ioc控制反转、di依赖注入,通过server provider服务提供者bind绑定实例放入到容器内,
然后通过make解析容器中的某个实例,可以通过facade门面直接静态调用。

php基础知识**

php面向对象说下
封装、继承、动态
多态描述下
当时这里说成了重载了,真是扇自己一巴掌,其实多态是一套接口下面的实现类,注入的是接口类,使用的是实现类,从而实现多态
php的类型有哪些
还真的忘了,掌嘴,没说完整,说了array数组、string字符串、object对象、resource资源、NULL

laravel包**

dingo/api和jwt-auth是自己搭的吗?有没有遇到坑?
当时项目赶,用的集成的,自己搭也是没问题的
entrust怎么用的?有哪些表?
user用户表、role角色表、perm权限表、role-user用户角色关联表、role-perm角色权限关联表
我们还做了扩展,menu菜单表、menu-perm菜单权限关联表

你未来的发展规划, 1年的,3年的

自由发挥,其实也蛮重要的,往积极方面答总没错,比如深入php、扩展技术栈

你可以问我两个问题?

当场黑人问号,为什么是两个问题?
面试官:我想看你的关注点
我说了这边技术团队是怎样的+有没有技术分享+我加入公司将做什么
别问我为什么问了三个,因为我get到了面试官的点,哈哈哈

其 他

简历上的项目询问,为什么离职,之前收获了什么,你期待的公司是怎样的etc
为什么说套路呢,不然发现这个面试官所有准备的题都是有针对性的,后面他就指出我的基础不够扎实,并举例说一个基础扎实的人和
一个基础不扎实的人做同一个东西,基础扎实的可能很快就会做完且不会出错,而不扎实的老是需要google且做出的东西会出错,
也不知道哪里错了,因为是拿来主义并没有转为自己的东西。然后指出我没有系统学习过php,因为php容易入门,
但是学会它需要花很大功夫。最后说我的规划还不错,是加分项,哈哈哈。

四、面试总结

面了5家公司,拿了3份offer,自我感觉还良好吧,哈哈哈。最主要的还是心态、面试准备、面试总结、睡眠质量、水

写的挺流水化的,很多都有点遗忘,毕竟2星期后了,只能记住有意义的题目了。

有心的同学应该会看到我这个noteBook下面的其它知识,希望对你们有些许帮助。

后语:有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连