php程序员面试题目和答案总结_第1页
php程序员面试题目和答案总结_第2页
php程序员面试题目和答案总结_第3页
php程序员面试题目和答案总结_第4页
php程序员面试题目和答案总结_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——php程序员面试题目和答案总结php程序员面试题目和答案总结

PHP是一种用来制作动态网页的服务器端脚本语言,你通过PHP和HTML创造页面。今天我整理了php程序员面试题目和答案供大家参考,一起来看看吧!

php程序员面试题目和答案(精选篇1)

1、nginx的工作原理

Nginx由内核和模块组成,其中,内核的设计分外微小和干脆,完成的工作也分外简朴,仅仅

通过查找配置文件将客户端苦求映射到一个locationblock(location是Nginx配置中

的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块

去完成相应的工作。

2、PHP-FPM

Master主进程/Worker多进程模式。

启动Master,通过FastCGI协议监听来自Nginx传输的苦求。

每个Worker进程只对应一个连接,用于执行完整的PHP代码。

PHP代码执行完毕,占用的内存会全部销毁,下一次苦求需要重新再举行初始化等各种繁琐的操作。

只用于HTTPServer。

Swoole

Master主进程(由多个Reactor线程组成)/Worker多进程(或多线程)模式

启动Master,初始化PHP代码,由Reactor监听Socket句柄的事情变化。

Reactor主线程负责子多线程的均衡问题,Manager进程管理Worker多进程,包括TaskWorker的进程。

每个Worker采纳来自Reactor的苦求,只需要执行回调函数片面的PHP代码。

只在Master启动时执行一遍PHP初始化代码,Master进入监听状态,并不会终止进程。

不仅可以用于HTTPServer,还可以建立TCP连接、WebSocket连接。

3、为什么PHP7比PHP5性能提升了?

(1)、变量存储字节减小,裁减内存占用,提升变量操作速度

(2)、改善数组布局,数组元素和hash映射表被调配在同一块内存里,降低了内存占用、提升了cpu缓存命中率

(3)、提升了函数的调用机制,通过优化参数传递的环节,裁减了一些指令,提高执行效率

3、mysql主从的同步原理是什么?

当主数据服务器master举行写入数据或者更新数据操作的时候,数据更改会记录在二进制日志(binarylogfile)中,主服务器master与从服务器slave举行通讯的是I/O线程,它将修改的数据异步复制写入到slave服务器的中继日志(relaylogfile)中,从服务器slave与中继日志之间通信使用SQL线程,SQL线程可以异步从中继日志中读取数据后再写入到自己的数据库中,就完成了数据的主从同步功能。

主要:二进制日志

细节表达:

为什么有主从延迟:

1.Master负载过高、

Slave负载过高、

2.网络延迟、

机器性能太低、

MySQL配置不合理

3.怎么预防主从延迟:

缓存

4.订单为什么要拆单?假设拆单依据是什么?

由于考虑一个用户添置多个商品,多个商品属于多个商家。多个商家要发货,并且分钱。所以拆单

1.按照店铺拆分

2.按照商品类型拆分

假设拆单表设计如何设计?

5什么处境下使用不了索引

1.复合索引:不遵循最左原那么

2.模糊查询“%k”

3.假设mysql认为全表扫面要比使用索引快,那么不使用索引。

4.有规律运算符////2+2

5.假设条件中有or,有条件没有使用索引,即使其中有条件带索引也不会使用,换言之,就是要求使用的全体字段,都务必单独使用时能使用索引。

6.假设列类型是字符串,那么确定要在条件中使用引号引用起来,否那么不使用索引。

6.laravel和tp的识别

1.Laravel在表单提交的时候会有csrf跨站苦求伪造验证,Tp5那么没有

2.Laravel在苦求需要先定义路由,Tp5可以不定义,有pathinfo路由即可访问

3.Laravel在苦求之前会有中间件,Tp5会有前置操作和钩子

7.http和https识别

https数据加密===非对称加密

http明文传输

8.接口安好如何处理

1.访问

防刷

存储ip地址

accessToken

2.数据

一个传输过程中

httphttps

数据本身加密

对称加密

有一个秘钥

非对称加密

公钥

私钥

9.redis和memcache识别

1.数据类型

redis:字符串,hash,队列,有序集合,集合memcache:字符串

2.存储方式

memcache:内存存储不支持耐久化redis:支持耐久化

3.内存管理

redis:直接纳理空间memcache:将内存空间切割成大小不同的空间,按照存储数据的大小进程存储

10.如何理解雪崩,缓存穿透

缓存穿透:在缓存里面有数据,但是查询不到。所以读取数据库。

缓存穿透

缓存穿透是指查询一个确定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,假设从存储层查不到数据那么不写入缓存,这将导致这个不存在的数据每次苦求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决方案

有好多种方法可以有效地解决缓存穿透问题,最常见的那么是采用布隆过滤器,将全体可能存在的数据哈希到一个足够大的bitmap中,一个确定不存在的数据会被这个bitmap拦截掉,从而制止了对底层存储系统的查询压力。另外也有一个更为简朴粗暴的方法(我们采用的就是这种),假设一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们依旧把这个空结果举行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存雪崩

缓存雪崩是指在我们设置缓存时采用了一致的过期时间,导致缓存在某一时刻同时失效,苦求全部转发到DB,DB瞬时压力过重雪崩。

解决方案

缓存失效时的雪崩效应对底层系统的冲击分外可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而制止失效时大量的并发苦求落毕竟层存储系统上。这里共享一个简朴方案就时讲缓存失效时间分散开,譬如我们可以在原有的失效时间根基上增加一个随机值,譬如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事情。

11.反向代理主调度器挂掉如何处理

热备开启

12.http和websocket的识别

WebSocket是HTML5中的协议,支持耐久连接;而Http协议不支持耐久连接

13、¥this与$self的识别

1.self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化的

1.this可以调用本类中的方法和属性,也可以调用父类中的可以调的方法和属性,可以说除过静态和const常量,根本上其他都可以使用this联络

14、订单合单怎么合单

我们在订单处理工作中,假设一个交易单(父订单)下的多个子订单,客户要求发往不同的地址,那么就要把这个“交易单”对应生成多个“物流单”,这叫“订单拆分”。

假设客户不是通过购物车,而是分两次买下两个商品,那么展现两个“交易单”,且寄往同一个地址,我们对两个交易单只需要产生一个“物流单”,这叫“订单合并”。

15、支付同步和异步

同步是给客户看的,异步是服务器处理苦求。

同步是客户充值或者支付告成了,给客户一个提示,报告客户这个操作的结果是告成还是失败。起到的作用就是提示客户这个操作的结果是告成还是失败。

异步是服务器在后端处理支付告成或失败时的业务规律。同步通知:用于用户在支付宝页面付款完毕后自动跳转;

异步通知:其实是处理业务规律,譬如说修改客户的支付状态;

同步得到通知后跳转到自己的网址,然后根据参数报告客户支付结果,然后在更新状态。

异步其实就是一个双保险,假设同步没有跳转你的网址,可能是关机了,或者网速慢,无法完成数据更新的状态,这时候异步就发挥作用了,先判断是否支付,支付了就不必更新了,只返回支付宝success就行了,不然会一向异步通知

16、接口安好

接口安好一般分三片面:调用方身份令牌token(防CSRF攻击)、参数签名sign(防篡改)、时效性timestamp(防Dos攻击)

17、消息队列

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

18、http协议

HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,所以要理解HTTP协议,有必要先了解下TCP/IP协议相关的学识

TCP/IP协议族是由一个四层协议组成的系统,这四层分别为:应用层、传输层、网络层和数据链路层

19、TCP协议三次握手的描述如下:

第一次握手:客户端发送带有SYN标志的连接苦求报文段,然后进入SYN_SEND状态,等待服务端确实认。

其次次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段举行确认。同时,还要发送自己的SYN苦求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入SYN_RECV状态。

第三次握手:客户端接收到服务端的SYN+ACK报文段后,会想服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

发送的都是SYN,验证ACK,再次回返

释放的SYNACK的报文段

20、短连接

长链接,指在一个连接上可以连续发送多个数据包,在连接保持期间,假设没有数据包发送,需要双方发链路检测包。

管线化机制须通过永久连接(persistentconnection)完成,仅HTTP/1.1支持此技术(HTTP/1.0不支持),管线化不需要等待上一次苦求得到响应就可以举行下一次苦求。实现并行发送苦求。

21、苦求行:

方法:

GET获取资源

POST向服务器端发送数据,传输实体主体

PUT传输文件

HEAD获取报文首部

DELETE删除文件

OPTIONS询问支持的方法

TRACE追踪路径

协议/版本号

URL

苦求头:

通用首部(GeneralHeader)

苦求首部(RequestHeader)

响应首部(ResponseHeader)

实体首部(EntityHeaderFields)

响应行

HTTP/1.1)说明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

响应头

Date:生成响应的日期和时间;

Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1

响应体

22.laravel生命周期

1.加载public下index.php

2.通过composer加载bootstrap/app.php获取laravel实例

3.创造一个服务容器

4.加载kernel.php文件

5.加载服务供给者

6.通过request分发苦求,经过路由,中间件,找到操纵器的方法

7.处理苦求,返回结果

23.laravel框架契约

Laravel中的契约是指框架供给的一系列定义核心服务的接口

契约作用::松耦合和简朴。

简朴

当全体Laravel服务都统一在简朴接口中定义,很轻易判断给定服务供给的功能。契约可以充当框架特性的简明文档。

此外,基于简朴接口,代码也更轻易理解和维护。在一个浩瀚而繁杂的类中,与其追踪哪些方法是有效的,不如转向简朴、明净的接口

松耦合

由于我们基于一个来自包的概括的缓存类,假设包的API变了,那么相应的,我们的代码务必做修改。

24、分区类型

分区类型:

range分区:基于属于一个给定连续区间的列值,把多行调配给分区

list分区:类似于按range分区,识别在于List分区是基于列值匹配一个离散值集合中的某个值来举行选择

hash分区:基于用户定义的表达式的返回值来举行选择的分区,该表达式使用将要插入到表中的这些行的列值举行计算。这个函数可以包含MySql中有效的、产生非负整数值得表达式

key分区:类似于按HASH分区,识别在于Key分区只支持计算一列或多列,且MySql服务器供给其自身的哈希函数。务必有一列或多列包含整数

RANGE分区(分区是按照依次定义的):

基于属于一个给定连续区间的列值,把多行调配给分区

这些区间要连续且不能重叠,使用valueslessthan操作符来举行定义

LIST分区(增删变得轻易)

类似于按RANGE分区,识别在于List分区是基于列值匹配一个离散集合中的某个值来举行选择

List分区通过使用partitionbylist(expr)来实现,其中expr是某列值、并返回一个整数值的表达式,然后通过valusin(value_list)的方式来定义每个分区,其中value_list是一个通过逗号分隔的整数列表

HASH分区

基于用户定义的表达式的返回值来举行选择的分区,该表达式使用将要插入到表中的这些列值举行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

要使用HASH分区来分割一个表,要在CREATETABLE语句上添加一个“PARTITIONBYHASH(expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL整型的一列的名字。此外,你很可能需要在后面再添加一个“PARTITIONSnum”子句,其中num是一个非负的整数,它表示表将要被分割成分区的数量

KEY分区

类似于按HASH分区,识别在于KEY分区只支持计算一列或多列,且MySQL服务器供给其自身的哈希函数。务必有一列或多列包含整数值

25、线程和进程各自有什么识别和优劣呢?

进程是资源调配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它调配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作分外昂贵。而线程是共享进程中的数据的,使用一致的地址空间,因此CPU切换一个线程的花费远比进程要小好多,同时创造一个线程的开销也比进程要小好多。

线程之间的通信更便当,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)举行。不过如何处理好同步与互斥是编写多线程程序的难点。

但是多进程程序更刚强,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,由于进程有自己独立的地址空间。

26、接口调用这8种苦求方式:

1.GET:向特定资源发送苦求,查询数据

2.POST:向指定的资源,提交数据举行处理苦求,有可能创造或修改已有数据

3.HEAD:和Get苦求相一致,只不过不会返回响应体,这一方法可以再不必传输整个响应内容的处境下,就可以获取包含在响应小消息头中的元信息。(用于获取报头)

4.OPTIONS:返回服务器对特定资源所支持的http的苦求,可以用来向Web服务器发送苦求来测试服务器的功能性

5.PUT:向指定资源位置上传最新的内容

6.DELETE:苦求服务器删除Request-URI所标识的资源

7.TRACE:回显服务器收到的苦求,主要用于测试或诊断

8.CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

27.laravel容器

Laravel服务容器是一个用于管理类凭借和执行凭借注入的强大工具。凭借注入听上去很花哨,其实质是通过构造函数或者某些处境下通过set方法将类凭借注入到类中。

28.laravelORM和查询构建器关系?

所谓查询构建器,就是操作数据库的方法拢在一起组成个一个类!

在laravel的ORM中,一个类对应一张表,而一个模型可以当做一个Illuminate\Database\Eloquent\Builder的构建器使用

29.优化一个网站

页面的ob缓存,动静分开

架构上,反向代理,容灾,热备

缓存数据

数据库的索引,主从

30、上线流程?

1.把应用从负载均衡器上摘除(markdown)

留神:利用haproxy举行markdown,通过管理页面把服务标记成下线的状态,但是要留神这个时候正在处理的苦求是还在处理的只是新的苦求进不来,这一步是分外重要的,涉及到服务的可用性问题;并且markdown之后是不能马上中断服务的,一般要等10~20秒的时间给未处理完的苦求预留时间

还要留神假设你使用手动markdown是很烦人的,假设机器有好多台你还要一台台去markdown上线好之后还要去markup只要是人举行的工作都是会有错误产生的,所以可以使用基于内容的状态检测页面,,当检测到某字段或内容时把服务markup,当服务器数量较多时可使用自动化运维工具例如ansible也分外简朴

2.stopservice

3.deploywar自动部署

4.changenewlink就是第三步中说到的内容

一般在工作中是用links软链接,譬如这里有war2.1war2.2war2.3war2.4,我要上线的时候只需要改一下软链接(这样就不必去修改配置文件了)并且使用软链接还有一个好处是当你察觉新上线的包有问题时可以快速回滚,当然还有其它方法可以实现,但是一般大公司譬如腾讯,百度,阿里都采用这种上线方式

5.startservice

6.markup

31、php垃圾回收机制?

1.php引用计数根本学识点

每个php变量存在一个叫zval的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是is_ref,是个bool值,用来标识这个变量是否是属于引用集合(referenceset)。通过这个字节,php引擎才能把普遍变量和引用变量区分开来,由于php允许用户通过使用来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。其次个额外字节是refcount,用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。全体的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(譬如:通过欣赏器苦求的的脚本)和每个函数或者方法也都有作用域

2.php的内存管理机制

https://./myJuly/p/10002397.html:转载

3.php中垃圾是如何定义的?

判断是否为垃圾,主要看有没有变量名指向变量容器zval,假设没有那么认为是垃圾,需要释放

4.老版本php中如何产生内存泄漏?

产生内存泄漏主要真凶:环形引用。

5.5.3版本以后php是如何处理垃圾内存的?

1.假设一个zval的refcount增加,那么此zval还在使用,不属于垃圾

2.假设一个zval的refcount裁减到0,那么zval可以被释放掉,不属于垃圾

3.假设一个zval的refcount裁减之后大于0,那么此zval还不能被释放,此zval可能成为一个垃圾

来个白话文版:就是对此zval中的每个元素举行一次refcount减1操作,操作完成之后,假设zval的refcount=0,那么这个zval就是一个垃圾

6.涉及到垃圾回收的学识点

gc_enable():开启GC

gc_disable():关闭GC

gc_collect_cycles():在节点缓冲区未满的处境下强制执行垃圾分析算法

mysql默认编码?

拉丁编码

32、什么是索引笼罩?

假设一个索引包含(或笼罩)全体需要查询的字段的值,称为‘笼罩索引’。即只需扫描索引而无须回表。

只扫描索引而无需回表的优点:

1.索引条目通常远小于数据行大小,只需要读取索引,那么mysql会极大地裁减数据访问量。

2.由于索引是按照列值依次存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少好多。

3.一些存储引擎如myisam在内存中只缓存索引,数据那么凭借于操作系统来缓存,因此要访问数据需要一次系统调用

4.innodb的聚簇索引,笼罩索引对innodb表更加有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以假设二级主键能够笼罩查询,那么可以制止对主键索引的二次查询)

笼罩索引务必要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做笼罩索引。

索引的数据布局?

索引的数据布局:B-、B+、R-、散列

laravel框架门面?

1.购物车商品价格变化?

购物车储存一个商品id,商品其他属性数据库读取

监听服务器端保存价格的数据库。如何价格发生变化,在启动客户端时,对价格根据服务器的数据库数据举行刷新就可以了

33.事务的操作?

34.事务的隔离级别,幻读,脏读如何出来的.

1.脏读:

脏读就是指当一个事务正在访问数据,并且对数据举行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

3.幻读:

是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据举行了修改,这种修改涉及到表中的全部数据行。同时,其次个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户察觉表中还有没有修改的数据行,就好象

发生了幻觉一样。

6.事务特性哪些

7.索引种类

35、解析PHP全过程

用户苦求-》PHP处理-》zend转化成中间吗(c编写)-opcache-操作系统-》转成汇编-计算器识别-》ob缓存-》nginx-》协议-》客户端

php程序员面试题目和答案(精选篇2)

PHP常见的运行模式有2种,分别是php-fpm和php-cli。当PHP选择运行在php-fpm模式下,全体的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空。运行在php-cli模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存实现资源复用,性能可以得到很大的提升,php-cli虽然开发对比繁杂,但是能够获取更高的性能,对开发者的要求对比高需要对比高的开发水平,对比常用的模式是结合swoole组件编写cli框架,各种变量能保存在跨进程的高性能共享内存Table,可以开发出支持热启动的php-cli稳当各类应用系统。

php-fpm在PHP5.3.3版本成为了官方正式组件(2022-07-22),它供给了稳定稳当的进程管理服务,进程缺乏时候可以智能扩展数量,闲置时候可以自动回收销毁多余的进程,同时它对程序的容错才能很强大运行分外稳定,可以应付企业级的开发需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互联网协议下举行的用户的输入输出,页面级生命周期各种资源用完即释放,不存在内存泄漏的问题。php-fpm也供给有一些常驻内存的技术支持,例如PHP7.4引入的opcache.preload也能实现局部的PHP类和函数的常驻内存,不过这个方法不够生动,和服务器配置捆绑的太死了。

php-cli由于能实现各类资源的常驻内存,所以可以资源复用,更高效完成多进程编程和异步编程,可以开发出负载才能更高的应用系统。但是相对php-fpm的简朴编程开发,开发者要留神好多的事项和需要做好多附加的操纵器开发,否那么就无法实现期望中的高性能。

首先开发者需要去实现稳当的进程管理服务,保证系统进程遇到各类错误退出运行后能够自动创造新的进程,只有这样才能保证后续的服务苦求有足够空闲进程可调配。每个业务代码段都要做奇怪处理,让进程遇到非致命错误时候不会退出,由于进程重启意味程序和各类资源需要再次加载,这个过程性能消耗不小,所以只有进程稳定运行了常驻内存才有意义。

其次由于常驻内存,编写的新的程序务必重启服务才能生效,这一点习惯了fpm模式的开发者会感到对比目生。另外开发者需要手工释放内存,否那么系统长时间运行后会展现内存泄露。同时在cli模式下,我们不能像fpm里直接用$_SERVER、$_POST、$_GET、$_COOKI和$_FILES举行编程工作,需要自己去解析各种

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论