PHP面试总结

前言

面试是你进入公司的第一个关卡,如同高考一般,但是面试不是高考,高考只有一次,而面试则可以有N次,只要有合适的面试邀请,你就可以继续尝试,不要害怕失败;假如公司没有选择你,不是你不优秀,只是你不符合他们的要求罢了,结束后总结下面试中不足的地方,及时调整好心态,准备下个面试才是你最正确的做法。

面试准备

俗话说:“将军不打没准备的仗”,参加高考也是需要寒窗苦读12年甚至更久,而求职面试呢,也是需要提前准备的,主要分如下几个方面来准备:

  1. 自我介绍,这个不用我说了吧,几乎每场面试都会遇到
  2. PHP基础语法和函数
  3. 提前准备好怎么在面试官面前表述自己的项目(体现用到的技术与亮点/难点)
  4. 简历上自己的列出的专业技能,要看一下相关知识点,因为面试官会从你的这些技能中问你问题
  5. MySQL数据库方面,比如事务处理、索引、锁、查询优化、表结构设计等
  6. PHP进阶方面,例如MVC、OOP、算法、设计模式、redis等
  7. Javascript、Ajax、jQuery等前端知识,会Vue或者Node.js一般会有加分呢
  8. 丰富GitHub项目、博客以及自己活跃的社区主页信息等
  9. 准备好你的个人简历
  10. ……

技术面试知识点

MySQL索引

索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,从而提高性能,是MySQL查询优化之一。

更多索引相关详见 https://segmentfault.com/a/1190000003072424

MySQL优化

现如今,各种大数据、高并发的时代,数据库的操作越来越成为整个架构的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时,我们都需要注意数据操作的性能。而在面试过程中,也是经常会遇到的,所以,无论是面试准备还是日常开发,我们都应该关注这方面的东西。

更多优化方法和技巧详见 https://coolshell.cn/articles/1846.html

MySQL事务

我们都知道,事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位;所以MySQL事务主要用于处理操作量大,复杂度高的数据。

MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务;一般来说,事务都具备4个特性(ACID)::原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

更多MySQL事务详见 https://www.jianshu.com/p/bcc614524024

MyISAN与InnoDB的区别

MyISAN与InnoDB都是MySQL的数据库引擎之一,在5.5版之前MyISAM是MySQL的默认数据库引擎;MyISAN虽然性能极佳,但却有一个缺点:不支持事务处理(transaction),而恰恰相反,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,所以,如果在日常开发中,如果遇到不知道选择哪种表类型的,那么就选择InnoDB吧。

更多MyISAN与InnoDB的的比较详见 https://www.jianshu.com/p/a95...

HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW: World Wide Web)服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通信协议来传递数据,HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统,他的主要特点是:简单快速、灵活、无连接、无状态、支持B/S及C/S模式等。

HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

更多有关HTTP协议详见 https://www.jianshu.com/p/80e25cb1d81a

TCP/IP协议

从字面意义上讲,有人可能会认为TCP/IP是指TCP和IP两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用IP进行通信时所必须用到的协议群的统称。具体来说,IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP协议。他们与TCP或IP的关系紧密,是互联网必不可少的组成部分。TCP/IP一词泛指这些协议,因此,有时也称TCP/IP为网际协议群。

更多内容详见 https://juejin.im/post/5a069b6d51882509e5432656

四大基础算法

虽然工作中,你觉得自己并没有涉及到算法这方面的东西,但是算法是程序的核心,一个程序的好与差,关键是这个程序算法的优劣,所以对于冒泡排序、插入排序、选择排序、快速排序这四种基本算法,我想还是要掌握的。

通常,一个需求可以有多种算法实现,所以除了理解算法的实现之外,我们还需要关注算法的执行时间以及性能评估,这样,才能找到最优算法,而时间复杂度和空间复杂度就是衡量一个算法的优劣。

更多算法知识点详见 https://www.jianshu.com/p/a8cd6cbf733d
更多时间和空间复杂度详见 https://blog.csdn.net/zolalad/article/details/11848739

二分算法/二分查找

这个算法常用于在一个有序数组中查找某个值第一次出现的位置、最后出现的位置、或者是一段区间。用二分法后,由于每次可以去掉一半无用的区间,会将时间复杂度减少到O(logn),而通常,二分算法可以用递归以及不递归实现,这两种建议都了解下。

二分法的基本做法是:1、确定要查找的区间。2、确定要二分时的参照点。2、区间内选取二分点。3、根据二分点的值,综合左右区间情况以及求解的目的,舍去一半无用的区间。

更多二分算法解析详见 https://juejin.im/entry/585917c661ff4b006cba47cf

PHP7的新特性

PHP7将在2015年10月正式发布,PHP7,将会是PHP脚本语言的重大版本更新,同时将带来大幅的性能改进和新的特性,以及改进一些过时功能。该发布版本将会专注在性能加强,源自PHP版本树中的phpng分支。在硅谷公司的ZendCon会议,PHP工具厂商Zend技术官方讨论phpng和PHP7的进度。“(本次升级)真正专注于帮助业界的应用程序显著加强执行速度,再加上,我们在PHP中的其他改进,”Zend的首席执行官安迪特曼斯 (曾参与了PHP语言的持续开发和发展)表示。

PHP7的新特性主要有:标量类型声明、返回值类型声明、null合并运算符、太空船操作符、通过define()定义常量数组、匿名类等。

PHP7新特性详见 http://php.net/manual/zh/migration70.new-features.php

Nginx和Php-fpm的工作原理

我们知道Nginx (engine x)是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务器。而Php-fpm是FastCGI的实现,并提供了进程管理的功能。因为Nginx不只有处理http请求的功能,还能做反向代理;所以Nginx通过反向代理功能将动态请求转向后端Php-fpm。

更多原理详见 https://segmentfault.com/a/11...

ThinkPHP5/Lavavel的执行流程分析

例如从入口到控制器都干了啥、一个URL请求到达路由这里是怎么再到相应的控制器等,这可能涉及框架的源码分析,这个在面试过程中,我相信有不少人遇到过,具体的我就不多说了,需要在自己多去研究和分析了。

ThinkPHP5/Lavavel的比较

大家都知道,ThinkPHP5是国人开发的,各种参考文档都比较全,适合快速入门,而Laravel则是比较优雅的框架,也号称是最艺术的。这两种框架,都有自己很大的用户群体,有网友说:“ThinkPHP5的优势在于好用,Laravel的优势在于装逼。”具体的比较,请大家可以Google或者Baidu查询更多比较详情。

项目的攻坚点/架构

攻坚点这个就需要读者结合自己的项目经验进行总结归纳了,主要包括工作中遇到的问题和解决方案,也就是,这个项目中你的特长之处,做的比较好的方面以及攻克的技术难点。

架构的话呢,这个也会有问到的,我就在面试过程中,被遇到过很多次,你可以说一下自己最近这个项目的一个架构就行,后者,说一下你最熟悉的一个项目的架构也行,具体的可以自己查找相关资料深入了解。

Linux知识

Linux是开源的、免费的操作系统,稳定性、安全性与并发性得到业界公认,是一个统称,常见的CentOS、Ubuntu、Rethat……

Linux的特点主要有:开源、免费、多线程、多用户、安全性好、对内存和文件管理优越等;面试中,一般会问到一些你对于Linux的命令和用法的熟悉程度,如果你日常开发中,经常用到,那么我相信面试应该也不成问题,但是也还需要多了解一点。

OOP和MVC的理解

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。

PHP面向对象的三大特性是:封装、继承、多态;同时OOP软件的三个目标是:重用性、拓展性、灵活性。所以,采用OOP这种编程思想和技术为编程人员敞开了一扇大门,使其编程的代码更简洁、更易于维护,并且具有更强的可重用性。

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。

关于OOP的更多详见 http://www.runoob.com/php/php-oop.html
关于MVC的更多详见 http://www.manongjc.com/article/1864.html

设计模式

在软件工程中,设计模式(Design Pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。

设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类或对象来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类或对象。设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。其中,常见的设计模式有:工厂模式、单例模式等。

有关设计模式的更多请详见 http://larabase.com/collection/5/post/143

Redis和Memcache

Redis和Memcache都属于内存(memory)键-值(key-value)数据库,在设计和思想上有许多相同之处,功能和应用在很多场合(如分布式缓存服务)也相似。它们都从属于数据库解决方案中的nosql家族,由于两者都将数据存储在内存中,自然而然,它们都是非常理想的缓存实现方案。

Memcache最初是由Brad Fitzpatrick于2003年开发而成。而Redis则由Salvatore Sanfilippo于2009年创建,它本身也从Memcache上吸取借鉴大量宝贵经验教训,被称为“强化版Memcache”。确实,Redis在功能多样性方面要胜过Memcache,虽然强大且更具灵活性,但复杂程度也比Memcache更甚。而Redis和Memcache的不同点主要体现在:数据类型支持不同、内存管理机制不同、数据持久化支持、集群管理的不同等。

有关比较详情查看 https://www.biaodianfu.com/re...

前端技术

也许有的人会说,我作为一名后端开发人员,我需要学习前端技术吗?答案是肯定的,不管是对于工作还是自己的职业发展规划,前端技术都是需要学习和掌握的,例如Javascript、Jquery、Ajax都要了解的,如果会Vue或者Node.js等更好。在面试中,偶尔会涉及到一些。

Jsonp跨域的使用和原理

PHP处理跨域一般有三种方法:服务器代理、Jsonp、服务器脚本增加支持;有些网站处于安全考虑, 不会设置允许跨域, 而我们又刚好会用到一次跨域请求, 那么, Jsonp就派上用场了。

Jsonp如何实现跨域:由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。

其他更多有关Jsonp的用法,可以自行百度。

API的数据安全传输

前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提供的接口来进行业务交互,这个时候,数据信息就非常重要了。

我们常用到的尽量保证数据安全的方法主要方式有:使用https、请求签名(防止参数被篡改)、身份确认机制(每次请求都要验证是否合法)、APP中使用ssl pinning防止抓包操作、对所有请求和响应都进行加解密操作等;这里我想说一下,可以了解一下jwt。

什么是JWT https://www.jianshu.com/p/576dbf44b2ae

分析URL的组成部分

这个,主要采用PHP函数parse_url()来解析,本函数解析一个URL并返回一个关联数组,包含在URL中出现的各种组成部分,并了解URL的各个组成部分的含义和所在位置;一个URL,一般都包括:协议、域名、端口(web的很多80默认)、文件名、参数等。

有关parse_url的用法和返回值详见 http://www.php.net/manual/zh/function.parse-url.php

人事面试点

  • 你之前所在公司的离职原因
  • 谈谈你对加班的看法
  • 你为什么会选择来我们公司
  • 你未来的职业规划以及发展方向
  • 对自己的一个评价
  • 你的业余爱好,最近在看什么书
  • 对你的经历提出一些问题
  • 你还有什么问题要问我
  • 你在之前,有去过那些公司面试?接下来还约了其他的面试吗
  • 你的期望薪资以及要求
  • ……

最后

这是我结合自己面试过程中,总结的一些经验,希望能帮助到大家,如果有说的不对或者不到位的地方,欢迎指正和交流。在此,祝愿大家都能找到一份满意的工作。

原文地址:https://segmentfault.com/a/1190000016353193

posted @ 2018-11-16 20:45  sfornt  阅读(1162)  评论(0编辑  收藏  举报