PHP面试常见问题(个人整理)

目录

  • 1、设计模式
    • 1.1、PHP设计模式知道哪些
    • 1.2、设计模式应用场景
  • 2、Redis
      • 2.1、数据类型有哪些?
      • 2.2、Hash中,获取数据的时间复杂度?
      • 2.3、怎么实现数据的递减
  • 3、MySQL优化
  • 4、三次握手四次挥手原理
    • 4.1、三次握手
    • 4.2、四次挥手
  • 5、MySQL的锁机制
  • 6、消息队列
  • 7、Git分支管理
  • 8、开发环境上修改数据库字段怎么同步到生产环境
  • 9、创建一个多商户商城系统,要怎么架构系统
    • 9.1、系统前台
    • 9.2、系统后台
    • 9.3、业务拆分
    • 9.4、服务器集群与分布式
  • 10、浏览器输入‘www.baidu.com’展示出页面,都用了那些技术原理
  • 11、常见的HTML攻击类型
  • 12、事务是怎么保持原子性的
  • 13、Redis是怎么实现高并发的
  • 14、Nginx的缺点,Nginx与Apache的区别
  • 15、面向对象的特点
  • 16、商城的商品怎么保证不被多买
  • 17、怎么实现秒杀功能
  • 18、socket是怎么保证数据不会丢包的
  • 19、正向代理反向代理
    • 正向代理:
    • 反向代理
    • 总结
  • 20、swool
  • 21、消息队列的两种模式
    • 21.1、点对点模式
    • 21.2、发布/订阅模式
  • 22、Nginx优化
  • 23、索引的优化
    • 1、索引失效
    • 2、永远小表驱动大表
    • 3、order by排序
    • 4、注意的点
    • 5、优化
  • 24、http常见消息头部的含义
    • 1、请求头的含义
    • 2、响应头的含义
  • 25、swoole的websocket的热更新问题
  • 26、死锁是怎么解决的
    • 1、产生原因
    • 2、处理思路
    • 3、避免死锁
  • 27、两台服务器一台挂掉了,Nginx怎么保证请求不会去到挂掉的服务器
  • 28、什么是面向对象
    • 1、面向过程
    • 2、面向对象
  • 29、大文件是怎么读取的
  • 30、fpm是用来干什么的
  • 31、print、echo、print_r 有什么区别?
  • 32、什么叫视图?游标是什么?
  • 33、索引的作用?和它的优点缺点是什么?
  • 34、对于大流量的网站,采用什么样的方法来解决各个页面访问量统计问题?
  • 35、什么是构造函数,什么是析构函数,作用是什么?
  • 36、常用的魔术方法有哪些?
  • 37、ThinkPHP如何防止SQL注入?
  • 38、smarty配置主要有哪几项?
  • 39、ThinkPHP常用配置
  • 40、laravel常用配置

1、设计模式

PHP常用设计模式

1.1、PHP设计模式知道哪些

答:共23种设计模式,可分为三大类
创建型模式:常用的有 单例、工厂、建造者、原型等
结构型模式:适配器、装饰器、代理、外观、组合等
行为型模式:策略、观察者、解释器、命令、备忘录等

1.2、设计模式应用场景

  • 单例模式:数据库连接
  • 工厂模式:解耦,(流水线工作)
  • 外观模式和装饰器模式可以用来封装接口
  • 命令模式可以用来传递
  • 迭代器模式可以用来遍历对象
  • 观察者模式用来监听状态变化
  • 模板模式用来处理相同的操作步骤
  • 策略模式用来进行策略选择
  • 代理模式用来附加功能,属性或隐蔽

2、Redis

2.1、数据类型有哪些?

答:
string、list、hash、set、zset

2.2、Hash中,获取数据的时间复杂度?

PHP面试常见问题(个人整理)_第1张图片

2.3、怎么实现数据的递减

decr key

3、MySQL优化

MySQL的优化主要分为四大方面:

  • 设计:存储引擎、字段类型、范式与逆范式
  • 功能:索引、缓存、分区分表
  • 架构:主从复制、读写分离、负载均衡
  • SQL优化:测试、经验

4、三次握手四次挥手原理

4.1、三次握手

  • 客户端产生一个初始序列号 SEQ 作为 SYN,发送给服务端,客户端进入请求连接状态,等待服务端确认
  • 服务端收到后将客户端的 seq加1作为确认号 ack 与自己的syn一起返回给客户端,进入收到请求状态
  • 客户端为了确认服务端的syn,将服务端 seq+1作为ack返回给服务端,然后两者进入已连接状态

4.2、四次挥手

  • 客户端在连接状态时 给服务端发送 FIN 个seq,进入终止等待状态
  • 服务端收到后 将客户端的seq+1作为ack返回给客户端 服务端进入关闭等待状态
  • 服务端向客户端发送 FIN与自己的seq, 进入最后确认状态
  • 客户端收到FIN后,进入时间等待状态,接着将服务端的seq+1作为ack发送给服务端 ,服务端进入关闭状态

5、MySQL的锁机制

分为共享锁与排他锁:

  • 共享锁为S锁:lock in share mode
  • 排他锁为X锁:for update

6、消息队列

kafka
分布式消息队列:具有高吞吐量、低延迟、持久性、可靠性、容错性、可拓展性等特点

可以用来日志收集、消息系统、用户活动追踪、运营指标等

7、Git分支管理

分两个分支
master 主分支,项目随时可以发布
develop:开发分支,平行于master分支

开发时创建一个自己本地分支,完成功能后合并到develop分支,组长进行代码review与测试,通过后组长合并到master分支

8、开发环境上修改数据库字段怎么同步到生产环境

可以用工具实现
laravel框架可以用 add_username_to_users_table 来实现

9、创建一个多商户商城系统,要怎么架构系统

9.1、系统前台

主要功能模块包括:商品类型、商品检索、首页、频道页、单品页、营销专题、订单支付、购物流程、客户中心、帮助中心

9.2、系统后台

商品管理、类目管理、营销案管理、订单管理、供货商管理、配送商管理、会员管理、仓储管理、对账管理、互动管理、权限管理等

9.3、业务拆分

可以划分为:产品子系统、购物子系统、支付子系统、评论子系统、客服子系统、接口子系统(如短信等第三方外部系统)
又可以分为核心系统和非核心系统

  • 核心系统:产品子系统、购物子系统、支付子系统
  • 非核心系统:评论、客服、接口

每个子系统可以由单独的团队去负责,并且单独部署在服务器上

9.4、服务器集群与分布式

每个子系统可以分布在不同的服务器上,也可以同一个子系统多个服务器(也就是集群),可以提高业务处理的效率

数据库可使用主从复制,读写分离
缓存使用 Redis集群
再加上负载均衡

10、浏览器输入‘www.baidu.com’展示出页面,都用了那些技术原理

  • 输入域名

  • 向DNS服务器查询网站IP地址

  • DNS服务器返回网站IP地址(域名解析)

  • 浏览器得到地址后,把输入的域名转化为http服务请求

  • 服务器收到请求后,返回网页信息

  • 展示成可以查看的网页形式

  • 域名解析

  • 发起连接,构造请求(三次握手)

  • 数据转发

11、常见的HTML攻击类型

XSS(跨站脚本攻击)、CSRF(跨站请求伪造)、SQL注入、DDOS攻击、命令行注入、流量劫持

12、事务是怎么保持原子性的

一个事务要么全部提交成功,要么全部提交失败。
要保持原子性就要提到一致性,数据在执行前后是一致的。
要一致就需要说道它的隔离性,

13、Redis是怎么实现高并发的

redis是基于内存的操作的,单线程的,避免了不必要的上下文切换

14、Nginx的缺点,Nginx与Apache的区别

缺点:

  • nginx仅能支持http、HTTPS、和email协议,适用范围小一点
  • 对后端服务器的健康检查只能通过端口来检测,不支持通过URL来检测,不支持session的直接保持,但能通过ip_hash来解决

Nginx相对Apache的优点:

  • 轻量级、同样起web服务,比Apache占用更少的内存及资源
  • 抗并发、Nginx处理请求是异步非阻塞的,而Apache则是阻塞型的,在高并发下Nginx能保持低资源低消耗高性能
  • 编写模块相对简单
  • 社区活跃
  • 本身就是一个反向代理服务器
  • 支持七层负载均衡
  • 适合做静态,简单、效率高

Apache相对Nginx的优点:

  • rewrite(重写),比Nginx的重写强大
  • 模块多
  • 少bug
  • 超稳定
  • 适合做动态,稳定功能强

15、面向对象的特点

抽象、封装、继承、多态

16、商城的商品怎么保证不被多买

使用redis的队列来实现,将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会被多买。

17、怎么实现秒杀功能

redis消息队列 list数据类型, rpush lpop

18、socket是怎么保证数据不会丢包的

心跳机制与重连机制

19、正向代理反向代理

代理:代理其实是一个中介,A和B本来可以直连,中间插入一个C,C就是中介

正向代理:

代理访问外部资源
用途:

  • 访问原来无法访问的资源,如谷歌
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理

反向代理实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
作用:

  • 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,web服务器是内网
  • 负载均衡,通过反向代理服务器来优化网站的负载

总结

正向代理即是客户端代理,代理客户端,服务端不知道实际发起请求的客户端(买票的黄牛)

反向代理即是服务端代理,代理服务端,客户端不知道实际提供服务的服务端(租房的代理)

20、swool

swoole是一个协程高性能的网络通信引擎
解决了php缺失的功能,比如异步通信、持久连接等

进程:资源分配的最小单位,一个程序就是一个进程

线程:cpu调度执行的最小单位,多个线程可以并发执行,共享进程的所有资源

协程:比线程更轻量级,是由程序所控制的,具有极高的执行效率,没有线程切换的开销,不需要多线程的锁机制

21、消息队列的两种模式

消息队列包括两种模式,点对点模式,和发布/订阅模式

21.1、点对点模式

队列不可重复消费
点对点模式下包括三个角色:

  • 消息队列
  • 发送者(生产者)
  • 接收者(消费者)

PHP面试常见问题(个人整理)_第2张图片
消息发送者生产消息发送到队列中,然后消息接收者从队列中取出并消费消息。消息被消费后,队列中不在有存储,所以消息接收者不可能消费到已被消费的消息。

点对点模式的特点

  • 每一条消息只有一个消费者(即一旦被消费,消息就不存在消息队列中)
  • 发送者和接收者间没有依赖性,生产者发送消息后,不管有没有消费者在运行,都不会影响到发送者下次发送消息;
  • 消费者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;

队列实现了一个可靠的负载均衡

21.2、发布/订阅模式

主题可重复消费
发布/订阅模式下包括三个角色:

  • 角色主题(Topic)
  • 发布者(Publisher)
  • 订阅者(Subscriber)

PHP面试常见问题(个人整理)_第3张图片
发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

发布/订阅模式特点:

  • 每个消息可以有多个订阅者(消费者)
  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
  • 为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行

22、Nginx优化

  • 隐藏版本信息
  • 更改nginx服务的默认用户
  • 降权启动nginx
  • 优化进程个数
  • 优化绑定不同的进程到不同的cpu上
  • 事件处理模型优化
  • 调整单个进程允许的客户端最大连接数
  • 配置进程最大打开文件数
  • 开启高效传输模式
  • pastCGI相关参数调优
  • 优化linux内核参数(最大文件数量)
  • 增加数据包头部缓存大小
  • 对页面进行压缩处理
  • 服务器内存缓存
  • 浏览器本地缓存静态数据
  • 关闭access.log日志打印

23、索引的优化

1、索引失效

  • 最好全值匹配
  • 最左前缀法则:如果索引了多列,查询从索引的最左前列开始,且不能跳过索引中间列
  • 不在索引列上做任何操作(计算、函数、类型转换),会导致索引失效而转向全表扫描
  • 存储引擎不能使用索引中范围条件右边的列,即范围之后全失效
  • 尽量使用覆盖索引,只访问索引的查询(索引列和查询列一致),减少select *
  • MySQL在使用不等于的时候无法使用索引会导致全表扫描
  • is null, is not null也无法使用索引
  • like 以通配符开团(’ %aa ')索引会失效,变成全表扫描
  • 字符串不加单引号,索引失效
  • 少用 or,用它来连接时会索引失效

2、永远小表驱动大表

in 和 exists 的选择

3、order by排序

order by 语句使用索引最左前列

4、注意的点

  • 当访问数据占表数据 20%左右的时候,不走索引
  • 查找大量数据列而不能使用到覆盖索引
  • 表 数据量过少,也会不走索引

5、优化

使用index hint优化(确定非聚集索引能带来更好性能)

  • force index(index_name):强制走某个索引
  • use index(index_name):告诉优化器可以选择使用索引,但实际上优化器会自己判断进行选择,不一定会使用到
  • ignore index(index_name):告诉优化器在选择索引时忽略掉该索引

24、http常见消息头部的含义

1、请求头的含义

请求头一般都是客户端通过这个头,告诉服务器的消息:

  • Accept:客户端支持的数据类型
  • Accept-Charset:客户端采用的编码
  • Accept-Encoding:客户机支持的数据压缩格式
  • Accept-Language:客户机支持的语言环境
  • Host:想访问的主机名
  • If-Modified-Since:资源的缓存时间
  • Referer:它是从哪个资源来访问服务器的
  • User-Agent:客户机的软件环境
  • Cookie:可以向服务器带数据
  • Connection:请求完后是关闭还是保持链接
  • Date:客户机当前请求时间

2、响应头的含义

响应头一般都是服务器通过这个头,告诉浏览器的消息:

  • Location:这个头配合302状态码使用,告诉用户端找谁
  • Server:告诉浏览器服务器的类型
  • Content-Encoding:告诉浏览器数据采用的压缩格式
  • Content-Length:告诉浏览器回送数据的长度
  • Content-Language:告诉服务器的语言环境
  • Content-Type:回送数据的类型
  • Conent-Disposition:告诉浏览器以下载的方式打开数据
  • Last-Modified:告诉浏览器当前资源的缓存时间
  • Refresh:告诉浏览器隔多长时间刷新一次
  • Transfer-Encoding:告诉浏览器数据的传送格式
  • ETag:与缓存相关的头
  • Expires:告诉浏览器把回送的数据缓存多长时间。-1或0不缓存
  • Cache-Control和Pragma:也可以控制浏览器不缓存数据
  • Connection:响应完是保持链接还是关闭链接
  • Date:返回响应的时间

25、swoole的websocket的热更新问题

Server->reload
swoole底层提供了柔性终止/重启的机制。

26、死锁是怎么解决的

1、产生原因

是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远互相等待的进程称为死锁进程。

表级锁不会产生死锁,所以死锁主要还是针对于常用的InnoDB。

形成死锁的四个必要条件:

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

2、处理思路

处理死锁的思路如下:

  • 预防死锁:破坏四个必要条件中的一个或多个来预防死锁
  • 避免死锁:在资源动态分配的过程中,用某种方式防止系统进入不安全的状态
  • 检测死锁:运行时产生死锁,及时发现死锁,将程序解脱出来
  • 解除死锁:发生死锁后,撤销进程,回收资源,分配给正在阻塞状态的进程

3、避免死锁

避免死锁:

  • 加锁顺序:线程按照一定的顺序加锁
  • 加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁
  • 死锁检测

27、两台服务器一台挂掉了,Nginx怎么保证请求不会去到挂掉的服务器

在配置中增加 proxy_connect_timeout (代理连接超时)配置
默认时间为60秒,修改为1秒。

server {
	listen 80;
	server_name www.test.com
	location / {
		proxy_pass http://www.test.com; 
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_connect_timeout 1;
		proxy_read_timeout 1; // 也可不设置
		proxy_send_timoute 1; // 也可不设置
	}
	...

28、什么是面向对象

面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤和行为。

将繁琐的步骤,通过行为、功能,模块化,这就是面向对象。

1、面向过程

  • 优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销过大
  • 缺点:不易维护、复用、扩展
  • 用途:单片机、嵌入式开发、Linux/Unix等对性能要求较高的地方

2、面向对象

优点:易维护、易复用、易扩展。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活,更加易于维护
缺点:性能比面向对象低

类是一组相关的属性和行为的集合。是一个抽象的概念

对象是该类事务的具体表现形式。具体存在的个体。

29、大文件是怎么读取的

  • 内存映射
  • 使用linux命令 tail
  • 使用fseek函数
  • sql库函数

30、fpm是用来干什么的

nginx本身不能处理php,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返给客户端。

nginx一般是把请求发送 FastCGI管理进程处理,FastCGI管理进程选择CGI子进程处理结果并返回给nginx。

PHP-FPM是一个PHP FastCGI管理器,旨在将FastCGI进程管理整合进PHP包中。

PHP-FPM提供了更好的php进程管理方式,可以有效控制内存和进程,可以平滑重载php配置。

31、print、echo、print_r 有什么区别?

  • echo可以输出一个或多个字符串,多个以逗号隔开就行
  • print也可以输出一个或多个字符串,多个要用连接符
  • print_r 可以打印数组;对象

解析速度:echo>print>print_r

32、什么叫视图?游标是什么?

  • 视图:是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增、改、查操作,视图通常是有一个表或多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
  • 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

33、索引的作用?和它的优点缺点是什么?

索引就是一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。就类似目录。
索引可以是唯一的,创建索引允许指定单个列或多个列。

缺点:它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

34、对于大流量的网站,采用什么样的方法来解决各个页面访问量统计问题?

  • 首先,确认服务器硬件是否足够支持当前的流量
  • 其次,优化数据库访问
  • 第三,禁止外部的盗链
  • 第四,控制大文件的下载
  • 第五。使用不同主机分流主要流量
  • 最后,使用流量分析统计软件。

35、什么是构造函数,什么是析构函数,作用是什么?

  • 构造函数(方法):是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明类中,是一个特殊的成员方法。作用是执行一些初始化的任务。 PHP中使用 _construct()声明构造方法,并且只能声明一个。
  • 析构函数(方法):作用和构造函数相反,是对象被销毁之前最后一个被对象自动调用的方法。 是 PHP 5 中新添加的内容,作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。

36、常用的魔术方法有哪些?

  • __construct:构造函数,每次创建新对象时先调用此方法
  • __desstruct:析构函数,销毁对象时调用的
  • __call():在对象中调用不可访问方法时, 会被调用
  • __callStatic():在静态文件上下文中调用一个不可访问方法时,会被调用
  • __set():在给不可访问的属性赋值时调用
  • __get():读取不可访问的属性值时调用
  • __isset():当对不可访问的私有属性使用 isset 或 empty时调用
  • __unset():当对不可访问的私有属性使用unset时,自动调用
  • __toString():当一个类的实例对象,被当成一个字符串输出时调用

37、ThinkPHP如何防止SQL注入?

  • 查询条件尽量使用数组方式
  • 如果必须使用字符串查询条件,使用预处理机制
  • 开启数据字段类型验证,可以对数值类型做强制转换
  • 使用自动验证和自动完成机制
  • 对所有公共的操作方法做必要的安全检查,防止用户通过url直接调用
  • 不要缓存需要用户认证的页面
  • 对于用户的上传文件,做必要的检查,例如上传路径和非法格式
  • 富文本过滤
  • 对项目进行充分的测试,不要生成业务逻辑的安全隐患
  • 做好服务器的安全防护

38、smarty配置主要有哪几项?

  • 模板文件目录
  • 编译目录
  • 配置文件目录
  • 缓存目录
  • 开启缓存
  • 设置缓存有效期

iclude "./libs/Smarty.class.php";
 
$tpl = new Smarty();
 
// 模板文件目录
$tpl -> temlate_dir = 'templates/';
// 编译目录
$tpl -> compile_dir = 'templates_c/';
// 配置文件目录
$tpl -> config_dr = 'config/';
// 缓存目录
$tpl -> cache_dir = 'cache/';
// 开启缓存
$tpl -> caching = 1;
// 设置缓存有效期
$tpl -> cache_lifetime = 60 * 60 * 24;
$tpl -> left_delimiter = '<{';
$tpl -> right_delimiter = '}>';
 
?>

39、ThinkPHP常用配置

  • 调度器配置
  • URL模式配置
  • 是否检查文件大小写
  • 是否开启插件
  • 是否开启session
  • 日志设置
  • 错误设置
  • 系统变量设置
  • 模块和操作设置
  • 模板设置
  • 分页设置
  • 模型设置
  • 静态缓存设置
  • 语言时区设置
  • 数据库设置
  • 数据库缓存设置
  • 运行时间设置
  • 模板引擎设置
  • cookie设置
  • 数据格式设置

40、laravel常用配置

  • 开发者模式是否开启
  • 加密字符串设置
  • MySQL设置
  • 主机名配置

你可能感兴趣的:(PHP面试常见问题(个人整理))