面试问题总结二(技术能力-PHP)----Ⅲ
Posted zwesy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试问题总结二(技术能力-PHP)----Ⅲ相关的知识,希望对你有一定的参考价值。
42、什么是单点登录?
答:单点登录 SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。
43、什么情况下使用单点登录?
答:当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个 ticket 带上,作为自己认证的凭据,应用系统接受到请求之后会把 ticket 送到认证系统进行校验,检查 ticket 的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统 2 和应用系统 3 了。
实现主要技术点:
1、两个站点共用一个数据验证系统
2、主要通过跨域请求的方式来实现验证及 session 处理。
44、如何实现第3方登录?
答:第三方登陆主要是基于 author 协议来实现,下面简单说下实现流程:
1、首先我们需要以开发者的身份向第三方登陆平台申请接入应用,申请成功后,我们会获得一个 appID 和一个 secrectID。
2、当我们的网站需接入第三方登陆时,会引导用户跳转到第三方的登陆授权页面,此时把之前申请的 appID 和 secrectID 带给登陆授权页面。
3、用户登陆成功后即得到授权,第三方会返回一个临时的 code 给我们的网站。
4、我们的网站接受到 code 后,再次向我们的第三方发起请求,并携带接收的 code,从第三方获取 access_token。
5、第三方处理请求后,会返回一个 access_token 给我们的网站,我们的网站获取到 access_token 后就可以调用第三方提供的接口了,比如获取用户信息等。
6、最后把该用户信息存入到我们站点的数据库,并把信息保存到 session 中,实现用户的第三方登陆。
45、如何处理负载、高并发?(重点,经常提到,在实际开发过程中也经常遇到)
答:从低成本、高性能和高扩张性的角度来说有如下处理方案:
1、html 静态化其实大家都知道,效率最高、消耗最小的就是纯静态化的 html 页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛、阿里云、西部数据等
3、数据库集群和库表散列及缓存数据库的并发连接为 100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如 memcache、redis。
4、镜像:尽量减少下载,可以把不同的请求分发到多个镜像端。
5、数据库优化
6、负载均衡:Apache 的最大并发连接为 1500,只能增加服务器,可以从硬件上着手,如 F5 服务器。当然硬件的成本比较高,我们往往从软件方面着手。负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。
目前使用最为广泛的负载均衡软件是 nginx、LVS、HAProxy。我分别来说下三种的优缺点:
Nginx: 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
Nginx 的优点:
-
工作在网络的 7 层(应用层)之上,可以针对 http 应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比 HAProxy 更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx 单凭这点可利用的场合就远多于 LVS 了。
-
Nginx 对网络稳定性的依赖非常小,理论上能 ping 通就就能进行负载功能,这个也是它的优势之一;相反 LVS 对网络稳定性依赖比较大;
-
Nginx 安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS 的配置、测试就要花比较长的时间了,LVS 对网络依赖比较大。
-
可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比 LVS 相对小些。
-
Nginx 可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持 url 来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。
-
Nginx 不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的 Web 应用服务器。LNMP 也是近几年非常流行的 web 架构,在高流量的环境中稳定性也很好。
-
Nginx 现在作为 Web 反向加速缓存越来越成熟了,速度比传统的 Squid 服务器更快,可以考虑用其作为反向代理加速器。
-
Nginx 可作为中层反向代理使用,这一层面 Nginx 基本上无对手,唯一可以对比 Nginx 的就只有 lighttpd 了,不过 lighttpd 目前还没有做到 Nginx 完全的功能,配置也不那么清晰易读,社区资料也远远没 Nginx 活跃。
-
Nginx 也可作为静态网页和图片服务器,这方面的性能也无对手。还有 Nginx 社区非常活跃,第三方模块也很多。
Nginx的缺点:
-
Nginx 仅能支持 http、https 和 Email 协议,这样就在适用范围上面小些,这个是它的缺点。
-
对后端服务器的健康检查,只支持通过端口来检测,不支持通过 url 来检测。不支持 Session 的直接保持,但能通过 ip_hash 来解决。
LVS:使用 Linux 内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
LVS的优点:
-
抗负载能力强、是工作在网络 4 层(传输层)之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和 cpu 资源消耗比较低。
-
配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
-
工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS+Keepalived,不过我们在项目实施中用得最多的还是 LVS/DR+Keepalived。
-
无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会受到大流量的影响。
-
应用范围比较广,因为 LVS 工作在 4 层,所以它几乎可以对所有应用做负载均衡,包括 http、数据库、在线聊天室等等。
LVS的缺点:
-
软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx/HAProxy+Keepalived 的优势所在。
-
如果是网站应用比较庞大的话,LVS/DR+Keepalived 实施起来就比较复杂了,特别是 Windows Server 的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived 就简单多了。
HAProxy:使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy的特点:
-
HAProxy 也是支持虚拟主机的。
-
HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie 的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。
-
HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。
-
HAProxy 支持 TCP 协议的负载均衡转发,可以对 mysql 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,大家可以用 LVS+Keepalived 对 MySQL 主从做负载均衡。
-
HAProxy 负载均衡策略非常多,HAProxy 的负载均衡算法现在具体有如下 8 种:
- ① roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
- ② static-rr,表示根据权重,建议关注;
- ③ leastconn,表示最少连接者先处理,建议关注;
- ④ source,表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制类似,我们用其作为解决 session 问题的一种方法,建议关注;
- ⑤ ri,表示根据请求的 URI;
- ⑥ rl_param,表示根据请求的 URl 参数’balance url_param’ requires an URL parameter name;
- ⑦ hdr(name),表示根据 HTTP 请求头来锁定每一次 HTTP 请求;
- ⑧ rdp-cookie(name),表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。
Nginx 和 LVS 对比的总结:
-
Nginx 工作在网络的 7 层,所以它可以针对 http 应用本身来做分流策略,比如针对域名、目录结构等,相比之下 LVS 并不具备这样的功能,所以 Nginx 单凭这点可利用的场合就远多于 LVS 了;但 Nginx 有用的这些功能使其可调整度要高于 LVS,经常要去调整配置,人为出问题的几率较大。
-
Nginx 对网络稳定性的依赖较小,理论上只要 ping 得通,网页访问正常,Nginx 就能连得通,这是 Nginx 的一大优势!Nginx 同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;LVS 就比较依赖于网络环境,目前来看服务器在同一网段内并且 LVS 使用 direct 方式分流,效果较能得到保证。另外注意,LVS 需要向托管商至少申请多一个 ip 来做 Visual IP,貌似是不能用本身的 IP 来做 VIP 的。
-
Nginx 安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。LVS 的安装和配置、测试就要花比较长的时间了;LVS 对网络依赖比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。
-
Nginx 也同样能承受很高负载且稳定,但负载度和稳定度差 LVS 还有几个等级:Nginx 处理所有流量所以受限于机器 IO 和配置;本身的 bug 也还是难以避免的。
-
Nginx 可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前 LVS 中 ldirectd 也能支持针对服务器内部的情况来监控,但 LVS 的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而恼火。
-
Nginx 对请求的异步处理可以帮助节点服务器减轻负载,假如使用 apache 直接对外服务,那么出现很多的窄带链接时 apache 服务器将会占用大 量内存而不能释放,使用多一个 Nginx 做 apache 代理的话,这些窄带链接会被 Nginx 挡住,apache 上就不会堆积过多的请求,这样就减少了相当多的资源占用。这点使用 squid 也有相同的作用,即使 squid 本身配置为不缓存,对 apache 还是有很大帮助的。
-
Nginx 能支持 http、https 和 email(email 的功能比较少用),LVS 所支持的应用在这点上会比 Nginx 更多。在使用上,一般最前端所采取的策略应是 LVS,也就是 DNS 的指向应为 LVS 均衡器,LVS 的优点令它非常适合做这个任务。重要的 ip 地址,最好交由 LVS 托管,比如数据库的 ip、webservice 服务器的 ip 等等,这些 ip 地址随着时间推移,使用面会越来越大,如果更换 ip 则故障会接踵而至。所以将这些重要 ip 交给 LVS 托管是最为稳妥的,这样做的唯一缺点是需要的 VIP 数量会比较多。Nginx 可作为 LVS 节点机器使用,一是可以利用 Nginx 的功能,二是可以利用 Nginx 的性能。当然这一层面也可以直接使用 squid,squid 的功能方面就比 Nginx 弱不少了,性能上也有所逊色于 Nginx。Nginx 也可作为中层代理使用,这一层面 Nginx 基本上无对手,唯一可以撼动 Nginx 的就只有 lighttpd 了,不过 lighttpd 目前还没有能做到 Nginx 完全的功能,配置也不那么清晰易读。另外,中层代理的 IP 也是重要的,所以中层代理也拥有一个 VIP 和 LVS 是最完美的方案了。具体的应用还得具体分析,如果是比较小的网站(日 PV 小于 1000 万),用 Nginx 就完全可以了,如果机器也不少,可以用 DNS 轮询,LVS 所耗费的机器还是比较多的;大型网站或者重要的服务,机器不发愁的时候,要多多考虑利用 LVS。
46、做秒杀时表锁定的可行性?
答:使用事务加上排他锁来实现秒杀,但高并时,对数据库的性能影响很大,导致数据库的压力很大,一般不建议使用,而是采用Redis的队列来实现。
47、大流量高并发架构方面的配置?
答:1、数据库的读写分离、主从复制及集群。
2、Nginx 负载均衡
3、redis 集群及主从
48、谈谈对MVC 的认识?
答:核心思想是:视图和用户交互通过事件导致控制器改变 控制器改变导致模型改变 或者控制器同时改变两者 模型改变 导致视图改变 或者视图改变 潜在的从模型里面获得参数 来改变自己。他的好处是可以将界面和业务逻辑分离。Model(模型),是程序的主体部分,主要包含业务数据和业务逻辑。View(视图),是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在 View 视图层输入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理。Contorller(控制器),Contorller 是用来处理用户 输入数据,已经更新业务模型的部分。控制器中接收了用户与界面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态。
49、session 和 cookie 的区别?
答:1、cookie 数据存放在第三方应用的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE,进行 COOKIE 欺骗考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用 COOKIE。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
5、个人建议: 将登陆信息等重要信息存放为 SESSION 其他信息如果需要保留,可以放在 COOKIE
50、echo 、print、print_r、var_dump()之间的区别?
答:echo 可以一次输出多个值,多个值之间用逗号分隔。echo 是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。echo 是 php 的内部指令,不是函数,无返回值。
print():函数 print()打印一个值(它的参数),如果字符串成功显示则返回 true,否则返回 false。只能打印出简单类型变量的值(如 int,string),有返回值printf():源于 C 语言中的 printf()。该函数输出格式化的字符串。
print_r()和 var_dump()print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以 Array 开头。但 print_r()输出布尔值和 NULL 的结果没有意义,因为都是打印" "。因此用 var_dump()函数更适合调试。
print_r 是函数,可以打印出比较复杂的变量(如数组,对象),有返回值。
var_dump()判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
51、foo() 与 @foo 的区别?
答:1、@foo() 是错误控制输出,foo()是正常调用输出。
2、@符号在PHP 中可以忽略错误报告,对于表达式有提示错误的,但有不影响语句执行的,可以在表达式之前加@。
3、可以把@符号放在变量、函数和include() 调用、常量等之前,但不能把@放在函数、类的定义之前,也不能用于条件结构语句之前
如:if 、switch、while、for和foreach等
52、传值和传引用的区别?在什么情况下使用传引用?
答:PHP传值:在函数范围内,改变变量值的大小,不会影响到函数外面的变量值。传值(彼此独立不影响)
PHP传引用(&):在函数范围内,改变变量值的大小,会影响到函数外的变量值,在函数外部也会有所体现,因为传引用传的是变量的内存地址、指针。
以下情况适合传引用:
传值需要消耗的时间要大于传引用,特别是传大型的字符串或对象时;
传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高。
53、单引号和双引号的区别?
答:1、单引号内部的变量不会执行, 双引号会执行。
2、单引号解析速度比双引号快。
3、单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。
54、数据传输中 get 和 post 方式的区别?
答:1. 一般而言:get 是从服务器上获取数据,post 是向服务器传送数据。
2. get 是把参数数据队列加到提交表单的 ACTION 属性所指的 URL 中,值和表单内各个字段一一对应,在 URL 中可以看到。post 是通过 HTTP post 机制,将表单内各个字段与其内容放置在 HTML HEADER 内一起传送到 ACTION 属性所指的 URL 地址。用户看不到这个过程。
3. get 传送的数据量较小,不能大于 2KB。post 传送的数据量较大,一般被默认为不受限制。
4. get 安全性非常低,post 安全性较高。但是执行效率却比 Post 方法好。
55、索引的优缺点?
答:优点:
1、可以保证数据库表中每一行的数据的唯一性
2、可以大大加快数据的索引速度
3、加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义
4、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
5、通过使用索引,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能
缺点:
1、 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
2、 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,如果需要建立聚簇索引,那么需要占用的空间会更大
3、 以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度
建立索引的原则:
1、在经常需要搜索的列上,可以加快搜索的速度
2、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
3、 在经常用在连接的列上,这些列主要是一外键,可以加快连接的速度
4、 在经经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
5、 在经常需要排序的列上,因为索引已经排序,这样可以利用索引的排序,加快排序时间
6、 在经常使用在 where 子句中的列上,加快条件的判断速度
56、如何修改session 的生存周期?
答:1、在 php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间
2、代码实现 $lifeTime = 24 * 3600; // 保存一天
session_set_cookie_params($lifeTime);
session_start();
以上是关于面试问题总结二(技术能力-PHP)----Ⅲ的主要内容,如果未能解决你的问题,请参考以下文章
我把面试问烂了的⭐Spring面试题⭐总结了一下(带答案,万字总结,精心打磨,建议收藏)