分享一下 Laravel、PHPer 面试可能会遇到的问题(已更新部分答案)
Laravel、PHP面试指南
更新了一些答案,github地址点我点我,求一个star
Laraveler、PHPer面试指南
其实就是最近找工作发现的一些你可能经常用,但是理论说不清楚的问题,这里做的收集整理
PHP
-
strrpos() strripos() stripos() strpos() 之间的区别
- strrpos() 查找字符串在另一字符串中最后一次出现的位置,区分大小写
- strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
- stripos() 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
- strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写)
-
array_map 和 array_walk 的区别?
- array_walk 主要是要对数组内的每个值进行操作,操作结果影响原来的数组
- array_map 主要是对数组中的值进行操作后返回数组,以得到一个新数组
- walk 可以没有返回值 map要有,因为要填充数组
-
ucfirst lcfirst ucwords strtoupper strtolower 的区别
- ucfirst() 函数把字符串中的首字符转换为大写。
- lcfirst() - 把字符串中的首字符转换为小写
- ucwords() - 把字符串中每个单词的首字符转换为大写
- strtoupper() - 把字符串转换为大写
- strtolower() - 把字符串转换为小写
-
HTTP状态码有哪些? 区别?
-
10x 信息,服务器收到请求,需要请求者继续执行操作 (收到请求了,你丫继续操作)
- 100 继续。客户端应继续其请求
- 101 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
-
20x 成功,操作被成功接收并处理 (请求成功了)
- 200 请求成功。一般用于GET与POST请求
- 201 已创建。成功请求并创建了新的资源
- 202 已接受。已经接受请求,但未处理完成
- 203 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
- 204 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
- 205 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
- 206 部分内容。服务器成功处理了部分GET请求
-
30x 重定向,需要进一步的操作以完成请求 (收到请求了,去别的地方处理吧)
- 300 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
- 301 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
- 302 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
- 303 查看其它地址。与301类似。使用GET和POST请求查看
- 304 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
- 305 使用代理。所请求的资源必须通过代理访问
- 306 已经被废弃的HTTP状态码
- 307 临时重定向。与302类似。使用GET请求重定向
-
40x 客户端错误 请求包含语法错误或无法完成请求 (你丫自己操作错了,会不会玩?)
- 400 客户端请求的语法错误,服务器无法理解
- 401 未认证
- 402 保留,将来使用
- 403 服务器理解请求客户端的请求,但是拒绝执行此请求
- 404 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
- 405 客户端请求中的方法被禁止
- 406 服务器无法根据客户端请求的内容特性完成请求
- 407 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
- 408 服务器等待客户端发送的请求时间过长,超时
- 409 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
- 410 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
- 411 服务器无法处理客户端发送的不带Content-Length的请求信息
- 412 客户端请求信息的先决条件错误
- 413 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
- 414 请求的URI过长(URI通常为网址),服务器无法处理
- 415 服务器无法处理请求附带的媒体格式
- 416 客户端请求的范围无效
- 417 服务器无法满足Expect的请求头信息
-
50x 服务器错误,服务器在处理请求的过程中发生了错误(开发和运维还没死快抬上来)
- 500 服务器内部错误,无法完成请求
- 501 服务器不支持请求的功能,无法完成请求
- 502 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
- 503 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
- 504 充当网关或代理的服务器,未及时从远端服务器获取请求
- 505 服务器不支持请求的HTTP协议的版本,无法完成处理
-
-
PHP7和PHP5的区别,具体多了哪些新特性?
- 性能提升了两倍
- 结合比较运算符 (<=>)
- 标量类型声明
- 返回类型声明
- try...catch 增加多条件判断,更多 Error 错误可以进行异常处理
- 匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义
参考地址
-
为什么PHP7比PHP5性能提升了?
- 变量存储字节减小,减少内存占用,提升变量操作速度
- 改善数组结构,数组元素和 hash 映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
- 改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率
-
你知道哪些PHP自带的数组排序方法?
- sort() 函数用于对数组单元从低到高进行排序。
- rsort() 函数用于对数组单元从高到低进行排序。
- asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
- arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
- ksort() 函数用于对数组单元按照键名从低到高进行排序。
- krsort() 函数用于对数组单元按照键名从高到低进行排序。
laravel 模块
-
服务提供者是什么?
- 服务提供者是所有 Laravel 应用程序引导启动的中心, Laravel 的核心服务器、注册服务容器绑定、事件监听、中间件、路由注册以及我们的应用程序都是由服务提供者引导启动的。
-
Contract的原理?
- Contract(契约)是 laravel 定义框架提供的核心服务的接口。Contract 和 Facades 并没有本质意义上的区别,其作用就是使接口低耦合、更简单。
-
IoC容器是什么?
- IoC(Inversion of Control)译为 「控制反转」,也被叫做「依赖注入」(DI)。什么是「控制反转」?对象 A 功能依赖于对象 B,但是控制权由对象 A 来控制,控制权被颠倒,所以叫做「控制反转」,而「依赖注入」是实现 IoC 的方法,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。
其作用简单来讲就是利用依赖关系注入的方式,把复杂的应用程序分解为互相合作的对象,从而降低解决问题的复杂度,实现应用程序代码的低耦合、高扩展。
Laravel 中的服务容器是用于管理类的依赖和执行依赖注入的工具。
参考地址 -
依赖注入的原理?
- @overtrue 一句话解释:依赖注入只是一种模式:把当前类依赖的第三方实例通过参数传入的形式引入,但是如果手写依赖注入会比较费劲,管理起来也比较麻烦,因为要关心那么多类的依赖,于是就有了一个容器来自动解决这个问题,利用反射API检查类型,然后递归解决依赖。
-
Facade是什么?
- Facades(一种设计模式,通常翻译为外观模式)提供了一个"static"(静态)接口去访问注册到 IoC 容器中的类。提供了简单、易记的语法,而无需记住必须手动注入或配置的长长的类名。此外,由于对 PHP 动态方法的独特用法,也使测试起来非常容易。
-
了解过Composer?实现原理是什么?
- Composer 是 PHP 的一个依赖管理工具。工作原理就是将已开发好的扩展包从 packagist.org composer 仓库下载到我们的应用程序中,并声明依赖关系和版本控制。
缓存
- Redis、Memecache这两者有什么区别?
- Redis 支持更加丰富的数据存储类型,String、Hash、List、Set 和 Sorted Set。Memcached 仅支持简单的 key-value 结构。
- Memcached key-value存储比 Redis 采用 hash 结构来做 key-value 存储的内存利用率更高。
- Redis 提供了事务的功能,可以保证一系列命令的原子性
- Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中
- Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。
- Redis如何实现持久化?
- RDB 持久化,将 redis 在内存中的的状态保存到硬盘中,相当于备份数据库状态。
- AOF 持久化(Append-Only-File),AOF 持久化是通过保存 Redis 服务器锁执行的写状态来记录数据库的。相当于备份数据库接收到的命令,所有被写入 AOF 的命令都是以 redis 的协议格式来保存的。
设计模式
-
了解哪些设计模式?
-
创建性模式
单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、对象池模式、 原型模式
结构性模式
适配器模式、桥接模式、组合模式、装饰器模式、依赖注入、门面模式、链式操作、代理模式
注册器模式
行为性模式、观察者模式、责任链模式、模板方法、策略模式、访问者模式、遍历模式、空对象模式、状态模式、命令模式
参考资料
熟记SOLID原则
-
数据库
-
什么是索引,作用是什么?常见索引类型有那些?Mysql 建立索引的原则?
-
索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针,相当于书本的目录。其作用就是加快数据的检索效率。常见索引类型有主键、唯一索引、复合索引、全文索引。
-
索引创建的原则
- 最左前缀原理
- 选择区分度高的列作为索引
- 尽量的扩展索引,不要新建索引
-
高并发如何处理?
- 使用缓存
- 优化数据库,提升数据库使用效率
- 负载均衡
-
- MySQL日志格式以及优缺点?
- Statement: 每一条会修改数据的sql都会记录在binlog中
- 优点:binlog文件较小日志是包含用户执行的原始SQL,方便统计和审计出现最早,兼容较好
- 缺点:存在安全隐患,可能导致主从不一致对一些系统函数不能准确复制或是不能复制
- ROW: 不记录sql语句上下文相关信息,仅保存哪条记录被修改
- 优点:相比statement更加安全的复制格式在某些情况下复制速度更快(SQL复杂,表有主键)系统的特殊函数也可以复制更少的锁更新和删除语句检查是否有主键,如果有则直接执行,如果没有,看是否有二级索引,如再没有,则全表扫描
- 缺点:binlog比较大(myql5.6支持binlog_row_image)单语句更新(删除)表的行数过多,会形成大量binlog无法从binlog看见用户执行SQL(5.6中增加binlog_row_query_log_events记录用户的query)
- Mixed: 是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。
- 优点:混合使用row和statement格式,对于DDL记录statument,对于table里的行操作记录为row格式。 如果使用innodb表,事务级别使用了READ_COMMITTED or READ_UMCOMMITTED日志级别只能使用row格式。 但是使用ROW格式中DDL语句还是会记录成statement格式。
- 缺点:mixed模式中,那么在以下几种情况下自动将binlog模式由SBR模式改成RBR模式。 当DML语句更新一个NDB表 当函数中包含UUID时 2个及以上auto_increment字段的表被更新时 行任何insert delayed语句时 用UDF时 视图中必须要求使用RBR时,例如创建视图使用了UUID()函数
其他待解决问题
- 分库分表怎么设计
- 如何处理 MySQL 死锁?
- 谈谈你对闭包的理解
- PHP 内存回收机制
- 如何解决 PHP 内存溢出问题
- 数据库优化的方法
- 简述 Laravel 的运行原理
- Laravel 路由实现原理
- cookie 和 session 区别,session 保存在服务器的哪里?服务端是如何获取客户端的cookie?
- 服务器集群搭建、负载均衡、反向代理
- 服务器常用命令
感谢
overtrue
赵金超
以及所有Laravel-China的小伙伴
可补充答案或者问题,欢迎PR ?
高认可度评论:
对这些问题有压力的朋友们,请赞我
服务提供者是什么?
Contract的原理
这俩问题不是好问题,除非面试者明确说明熟悉使用 Laravel
@leo 所以我把这些问题都归纳到了Laravel模块,一般是简历里面有写用Laravel做过项目的,HR一般会问到的
这也要看面试什么等级的 phper,1万以下的就不要问人家这些问题了。
@dinghua 1万以下问这些问题的确有点过了,其实这是我面试最近中级PHP问到的,发现中级的要求也好高,这些问题能回答上来的并不多 我基本属于全挂:cry:
哈哈!还能说得上几个~
@happygeek 欢迎说出来讨论:smile:
@Rekkles :joy:
昨天刷到这儿时发现居然没看过
Facade
的源码,赶紧回家看完,在写了篇读后感!! :joy: :joy:对这些问题有压力的朋友们,请赞我
@ChiVincent 看过和知道、会做、理解不是一个意思...
@Rekkles 欸抖,因為牽涉到我最近在找工作的事兒,我先刪掉留言好了
@ChiVincent 不奇怪,我面试也遇到了这样的题 到现在还没找到工作 :cry:
PHP7 新特性看 php.net 不过都没怎么用过
Composer 原理也是基于spl_autoload_register 吧
redis 比 memcached 支持更丰富的数据类型,除了用作缓存,还可队列,消息通讯等
redis 持久化 有 aof rdb
@mingyun 厉害了
小伙伴们,答题都这里哦!:smile:
传送门: 博客:Laravel、PHPer 面试可能会遇到的问题及答案
@tw1996 你这个... 开口得25k往上唬了吧:cry:
@tw1996 校招那怪不得了,都是很基础的东西,恰恰相反,懂的并不多
答案已经跟新最新一版了,这里可以继续提问题或者完善答案,我抽空会放github
一言不合先star
@to2False 感谢支持
流量优化
做些防盗链处理 Referer
前端优化
减少HTTP的后台请求,js文件css文件压缩合并,图片合并.添加异步请求
启用浏览器的缓存和文件压缩,缓存HTML文件在浏览器
CDN加速 ,资源静态化
建立独立的图片服务器,大文件的服务器
服务端优化
页面实现静态化,PHP文件缓存成静态的HTML文件
并发处理,队列处理
数据库优化
MySQL缓存,文件缓存,服务器内存缓存 启用MySQL查询缓存 query_cache_type
0 不使用 ,1 始终使用, 2 表示按需要使用
数据库的缓存使用 Memcache,分布式的高速缓存系统 端口:11211, value 最大是 1M, 有效期是 30 天
工作流程:先检查客户端的请求数据是否在memcache中,如果有直接获取,不再对数据库进行任何操作,如果请求的数据不存在memcache中,就去查数据库,把从数据库中获取的数据,返回给客户端,同时吧数据缓存一份到memcache中
Redis,缓存的使用 value 最大 512M ,有序用 list 和 sorted set ,无序用 set, 发起事务用 multi; 持久化方式为内存快照和日志追加。redis事务支持比较弱,只能保证事务中的每个操作连续执行, redis支持多种类型的数据:
字符串 列表 集合 有序集合,哈希
MySQL优化:
数据表结构设计,数据类型的优化.索引优化,SQL语句的优化,使用limit,
手机号存 char, 年龄存,tinyint类型,md5加密也存char,可变的数据存varchar,IP地址存整型,可以用PHP函数,转换成长整型.
查询数据比较大,用limit做限制,一次查询一些,分解关联查询,优化关联查询
MySQL分库分表,分区进行操作,可以水平拆分,垂直拆分,
读写分离,主从复制
负载均衡的实现 Nginx的proxy实现了7层负载均衡,内置的策略: IPHash ,加权轮询
我觉得吧,题不重要,重要的是面试者回答的过程,因为有时候面试者可能只是单纯的记不得函数或者这个类叫啥。
cookie 和 session 区别,session 保存在服务器的哪里?服务端是如何获取客户端的cookie?
举个栗子先
小明(浏览器)去银行(服务端)存款(请求),银行(服务端)给了(响应)小明一个银行卡(cookie)(此时银行卡会被存入银行的数据库也就是负载均衡的共享session此时小明可以去任何地方的该银行都可以取钱),后来小明(浏览器)需要这笔钱,就拿着银行卡(cookie)去(请求)银行(服务端),银行(服务端)拿到银行卡(cookie)后根据银行卡(cookie)上面的卡号(sessionid)确定小明确实存了一笔钱,就给了小明存的钱。很长一段时间后小明一直都没有去过该银行,于是小明的银行卡被冻结(session被销毁)
综上所述:cookie是服务端存放在浏览器的一些数据,session则是存放在服务器端。每次浏览器请求服务都会携带cookie里面sessionid用于确定我来过你们服务器,通常session是保存在服务器的内存中,但是也可以保存在数据库、文件、redis等地方。
session只能被invalidate或者过期
(第一次发言,有错请指正)
分库分表怎么设计?
老规矩举个栗子先
比如有个商场(mysql的一个库),没天的人流量很大,但是每到节假日人流量就会剧增给游客很不好的用户体验,为了解决这个首先先进行分库操作比如可以把卖衣服、卖电器、卖书的继续分库处理这样每个库都会只处理自己的单一的读写操作。但是现在游客主要都是来买书的不管你的衣服和电器,所以现在需要对卖书的库进行分表操作,比如卖书的数据库中会存放订单表、书籍表等等,这样我们就可以对卖书的库进行分表操作把原来的订单表单独放到一个数据库中,这样压力仅仅为订单的读写。但是现在问题又来了,人家只看书人家不怎么买的,此时你的的书籍表的库也承受不了了,此时就需要使用水平拆分(这个说真的我没有用过全是了解的,所以我就不说了ε=(´ο`)))唉,希望有用的人补充)了。
终上所述:首先先根据你的业务进行分库处理,再根据你的具体的业务压力进行进一步的拆分,至于水平和垂直拆分就等有会的人来补充吧(ε=(´ο`)))唉)
@medz 面试过程的确很重要,不过嘛。感觉作为不了解的人。看到了可以扩充自己的知识。(^__^) ……,因为也不是所有人都知道所有的东西
这里面的大部分问题都太简单,只适合初级。部分 Laravel 原理相关的东西又太难。
@johnlui Laravel 原理,翰哥给举个栗子讲下呗:joy:
@johnlui 大佬光临,还望指点一二?
已star
前段时间去面试,上面归纳的PHP相关,HTTP相关,设计模式相关的问题一个都没问,缓存方面问了redis的线程模型以及如何实现并发,数据库方面问了mysql索引的数据结构实现,多机房数据同步,以及在工作中分库分表的具体操作,mongo方面问了一下复制集的高可用实现以及具体的原理。laravel方面问了自动依赖注入是如何实现的和服务容器有什么区别,剩下的都是算法和数据结构。。。
写的挺好的
@xcaptain
@xylovevae
@周先生
666
涨姿势了
个人观点,
这类纯语法函数类的考题实在是没啥意义,我们找的是工程师,不是手册。
楼主的内容更多是笔记而不是实战,平时积累需要,更多需要的是理解。
从面试考官的角度来看,我部分的面试方法:
马蜂窝内推
@yuechenxu 猎头还是HR?
@Rekkles 初级的表示几乎每家都问