面试高级PHP,面试官会问你哪些问题呢?

wufei123 发布于 2023-12-16 阅读(533)

php教程视频教程全集百度云

面试中面试官问你啥问题,小编都给你整理在这里了。每天都会整理一份最接地气的面试题,希望能帮助到你!

同时带上一套视频教程【带你横扫PHP职场 全面解读PHP面试】,感谢你对本PHP公众号的关注

,关注本公众号,回复:160705  即可获取更多学习课程请查看:IT自学资源分享平台商务合作加微信:22303040701. PHP 的生命周期 / 启动流程完整的生命周期为模块初始化、PHP请求初始化、请求处理、请求关闭、模块关闭。

五大阶段cli 模式下,每个脚本都会完整的执行上面的五大阶段;对于 fastcgi 模式而言,只在启动时会执行模块初始化,之后的请求都走了请求初始化、处理请求PHP、请求关闭三大阶段,在 fastcgi 关闭时执行模块关闭阶段。

各个扩展的加载也是在模块初始化阶段完成的2. 说一下 PHP 的(内存)垃圾回收机制每一个变量对应一个 zval 数据结构,在该结构内还PHP有一个 val 结构体,该结构体内有一个引用计数(php7 而言,对于 php5,这个引用计数是保存在 zval 结构中的),标识该对象的引用数,当对象的引用计数为 0 时代表这个对象可被回收。

对象的PHP refcount 减少的时机:修改变量、函数返回(释放局部变量)、unset 变量对于数组和对象而言,可能存在变量中的成员引用变量本身的情况,也就是循环引用,这样会造成这个变量永远不会被内存回收,而PHP成为垃圾。

PHP 里对于这种情况给出了垃圾回收机制:如果数组、对象的引用计数减少而且不为零,则认为他们可能是垃圾,把他们放到垃圾收集器里等垃圾收集器到了一定的数量之后,进行垃圾处理:对所有可能的垃圾 PHPrefcount 减 1,如果为 1,说明是垃圾,则进行内存回收;如果不为 1,说明还有其他变量在使用,refcount 重新加 1;。

这种对象复用以及垃圾回收机制在其他语言中也有体现:redis 中PHP也使用了引用计数表示每个对象的引用数量3.如果我的网站用的utf-8编码,为防止乱码出现,都需要注意哪些地方?从以下几个方面考虑:数据库中库和表都用utf8编码。

php连接mysql,指定数据库编码为PHPutf8 mysql_query(“setnames utf8”);php文件指定头部编码为utf-8header(“content-type:text/html;charset=utf-8”);

网站PHP下所有文件的编码为utf8,html文件指定编码为utf-8;4. PHP 短信验证码防刷机制

1)、时间限制:60 秒后才能再次发送从发送验证码开始,前端(客户端)会进行一个 60 秒的倒数,在这一分PHP钟之内,用户是无法提交多次发送信息的请求的这种方法虽然使用得比较普遍,但是却不是非常有用,技术稍微好点的人完全可以绕过这个限制,直接发送短信验证码。

2)、手机号限制:同一个手机号,24 小时之内不能够PHP超过 5 条对使用同一个手机号码进行注册或者其他发送短信验证码的操作的时候,系统可以对这个手机号码进行限制,例如,24 小时只能发送 5 条短信验证码,超出限制则进行报错(如:系统繁忙,请稍后再试)。PHP

然而,这也只能够避免人工手动刷短信而已,对于批量使用不同手机号码来刷短信的机器,这种方法也是无可奈何的3)、短信验证码限制:30 分钟之内发送同一个验证码网上还有一种方法说:30 分钟之内,所有的请求PHP,所发送的短信验证码都是同一个验证码。

第一次请求短信接口,然后缓存短信验证码结果,30 分钟之内再次请求,则直接返回缓存的内容对于这种方式,不是很清楚短信接口商会不会对发送缓存信息收取费用,如果有兴趣PHP可以了解了解4)、前后端校验:提交 Token 参数校验

这种方式比较少人说到,个人觉得可以这种方法值得一试前端(客户端)在请求发送短信的时候,同时向服务端提交一个 Token 参数,服务端对这个 ToPHPken 参数进行校验,校验通过之后,再向请求发送短信的接口向用户手机发送短信。

5)、唯一性限制:微信产品,限制同一个微信 ID 用户的请求数量如果是微信的产品的话,可以通过微信 ID 来进行识别,然后PHP对同一个微信 ID 的用户限制,24 小时之内最多只能够发送一定量的短信6)、产品流程限制:分步骤进行。

例如注册的短信验证码使用场景,我们将注册的步骤分成 2 步,用户在输入手机号码并设置了密码之后,PHP下一步才进入验证码的验证步骤7)、图形验证码限制:图形验证通过后再请求接口用户输入图形验证码并通过之后,再请求短信接口获取验证码。

为了有更好的用户体验,也可以设计成:一开始不需要输入图形验证码,在操作PHP达到一定量之后,才需要输入图形验证码具体情况请根据具体场景来进行设计8)、IP 及 Cookie 限制:限制相同的 IP/Cookie 信息最大数量

使用 Cookie 或者 IP,能够简单识别同一个用PHP户,然后对相同的用户进行限制(如:24 小时内最多只能够发送 20 条短信)然而,Cookie 能够清理、IP 能够模拟,而且 IP 还会出现局域网相同 IP 的情况,因此,在使用此方法的时候,应该根PHP据具体情况来思考。

9)、短信预警机制,做好出问题之后的防护以上的方法并不一定能够完全杜绝短信被刷,因此,我们也应该做好短信的预警机制,即当短信的使用量达到一定量之后,向管理员发送预警信息,管理员可以立PHP刻对短信的接口情况进行监控和防护。

5. 什么是单点入口呢?所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发比如Thinkphp使用index.php作为程序的单点入口,当然这个PHP是可以由你自己任意控制的单点入口有几大好处:。

第一、一些系统全局处理的变量,类,方法都可以在这里进行处理比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一PHP些对象或者变量到注册器里面第二、程序的架构更加清晰明了。

6. PHP 的控制反转 (IOC) 和依赖注入 (DI) 概念IOC(inversion of control)控制反转模式;控制反转是将组件PHP间的依赖关系从程序内部提到外部来管理;DI(dependency injection)依赖注入模式;依赖注入是指将组件的依赖通过外部以参数或其他形式注入;

7. 如何设计一个高并发的系统① 数据库的优化PHP,包括合理的事务隔离级别、SQL 语句优化、索引的优化② 使用缓存,尽量减少数据库 IO③ 分布式数据库、分布式缓存④ 服务器的负载均衡8. MongoDB 应用场景

mongodb 支持副本集、索引、PHP自动分片,可以保证较高的性能和可用性更高的写入负载默认情况下,MongoDB 更侧重高数据写入性能,而非事务安全,MongoDB 很适合业务系统中有大量 “低价值” 数据的场景。

但是应当避免在高事务安PHP全性的系统中使用 MongoDB,除非能从架构设计上保证事务安全高可用性MongoDB 的复副集 (Master-Slave) 配置非常简洁方便,此外,MongoDB 可以快速响应的处理单节点故障,自PHP动、安全的完成故障转移。

这些特性使得 MongoDB 能在一个相对不稳定(如云主机)的环境中,保持高可用性数据量很大或者未来会变得很大依赖数据库 (MySQL) 自身的特性,完成数据的扩展是较困难的事PHP,在 MySQL 中,当一个单达表到 5-10GB 时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用 MySQL 通常需要借助驱动层或代理层完成这类需求。

而 MongoPHPDB 内建了多种数据分片的特性,可以很好的适应大数据量的需求基于位置的数据查询MongoDB 支持二维空间索引,因此可以快速及精确的从指定位置获取数据表结构不明确在一些传统 RDBMS 中,增加一个字PHP段会锁住整个数据库 / 表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级。

通常发生在数据表大于 1G 的时候(当大于 1TB 时更甚)因 MongoDB 是文档型数据库,为非结构货的文档增PHP加一个新字段是很快速的操作,并且不会影响到已有数据另外一个好处当业务数据发生变化时,是将不在需要由 DBA 修改表结构。

9.什么是MySQL存储过程我们常用的操作数据库语言SQL语句在执行的时候需要要PHP先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它PHP

一个存储过程是一个可编程的函数,它在数据库中创建并保存它可以有SQL语句和一些特殊的控制结构组成当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的数据库中的存储过PHP程可以看做是对编程中面向对象方法的模拟。

它允许控制数据的访问方式优点:(1).存储过程增强了SQL语言的功能和灵活性存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算(2)PHP.存储过程允许标准组件是编程存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。

而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响(3).存储过程能实现PHP较快的执行速度如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。

因为存储过程是预编译的在首次运行一个存储过程时查询,优化器对其进行分析优PHP化,并且给出最终被存储在系统表中的执行计划而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

(4).存储过程能过减少网络流量针对同一个数据库对象的操作(如查PHP询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

(5).存PHP储过程可被作为一种安全机制来充分利用系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全10. MySQL 里有 2000PHPw 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据。

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)redis 提供 6PHP 种数据淘汰策略:volatile-lru:从已设置过期时间的数据集(server.db [i].expires)中挑选最近最少使用的数据淘汰。

volatile-ttl:从已设置过期时间的数据集(sePHPrver.db [i].expires)中挑选将要过期的数据淘汰volatile-random:从已设置过期时间的数据集(server.db [i].expires)中任意选择数据淘汰

allkeys-PHPlru:从数据集(server.db [i].dict)中挑选最近最少使用的数据淘汰allkeys-random:从数据集(server.db [i].dict)中任意选择数据淘汰no-envictiPHPon

(驱逐):禁止驱逐数据11.redis 是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办,同时会问 MYSQL 的同步方式和相关异常情况redis 集群主从同步的简单原理Redis 的PHP复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了 Redis 的复制功能,就一定会有内存快照发生。

当 Slave 启动并连接到 Master 之后,它将主PHP动发送一个 SYNC 命令 (首先 Master 会启动一个后台进程,将数据快照保存到文件中 [rdb 文件] Master 会给 Slave 发送一个Ping 命令来判断 Slave 的存活状态 当PHP存活时 Master 会将数据文件发送给 Slave 并将所有写命令发送到 Slave )。

Slave 首先会将数据文件保存到本地 之后再将 数据 加载到内存中当第一次链接 或者是 故障后 重新连接 PHP都会先判断 Slave 的存活状态 在做全部数据的同步,之后只会同步 Master 的写操作 (将命令发送给 Slave)。

问题:当 Master 同步数据时 若数据量较大 而 Master 本身只会PHP启用一个后台进程 来对多个 Slave 进行同步 , 这样 Master 就会压力过大 , 而且 Slave 恢复的时间也会很慢!

redis 主从复制的优点:(1)在一个Redis集群中,masterPHP负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供读服务从而提高了响应和读取速度。

(2) 在一个 Redis PHP集群中,如果 master 宕机,slave 可以介入并取代 master 的位置,因此对于整个 Redis 服务来说不至于提供不了服务,这样使得整个 Redis 服务足够安全。

(3) 水平增加 SlPHPave 机器可以提高性能12.两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的?不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数PHP据补偿,开写。

如果是核心业务的话,现在所有的写操作都在正常的状态机器上把好的这台机器的备机拉起来,当主机以上全是应急操作实际上数据库的容灾设计要复杂的多面试官要是问你,备机的数据不一致怎么办,你要勇敢PHP怼回去,你们每秒多少写入操作。

按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500这个级别的数据同步,出现差异的概率 可以忽略不计的有一台出现问题,另一台也可以抗住PHP正常的操作,还是先停写,等数据一致,切换,开写。

搞这些切换都是在凌晨 4.00 左右,核心业务的每秒写操作,只有十几个前后耽搁不到 20 秒文章首发:https://zhuanlan.zhihu.coPHPm/p/92670527以上是本文的全部内容,希望对大家的学习有帮助,觉得有用,就需要就支持一下吧。

亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。PHP

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

欧意 新闻98497