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

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

有心的同窗应该会看到我这个noteBook下面的其它知识,但愿对大家有些许帮助。html

本文地址前端

时间点:2017-11java

<!-- TOC -->mysql

<!-- /TOC -->

1、什么是面试

说到面试,仍是先说你为何要离职,

关键字:成长、发展、委屈、领导、钱(工资)突发感想是否是能够抓取下而后分析关键字,哈哈哈

还有

还想看吗

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

2、面试准备

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

1. 问:何时开始准备?

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

2. 问:怎么准备?

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

3、面试干货

一、某教育机构两面

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能力

困了,先到这里


二、某电商公司三人面

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

笔试题的解法见php7.php文件中的2四、2五、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 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吗?会背吗?脑子能留个大概的原理吗?

本身最满意的 代码

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

其它

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

困了,睡


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

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

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》,首先问了我上面那道题,而后说你看的书不够深刻,我。。。。

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

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、扩展技术栈

其余

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

五、某旅游公司两面

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

为何离职

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

如何选择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容易入门,
可是学会它须要花很大功夫。最后说个人规划还不错,是加分项,哈哈哈。

4、面试总结

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

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

有心的同窗应该会看到我这个noteBook下面的其它知识,但愿对大家有些许帮助。

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

相关文章
相关标签/搜索