文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP面试题基础知识有哪些

2023-06-29 09:20

关注

这篇文章主要介绍“PHP面试题基础知识有哪些”,在日常操作中,相信很多人在PHP面试题基础知识有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP面试题基础知识有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

PHP面试题基础知识有哪些

一、php 数组底层实现原理

1、底层实现是通过散列表(hash table) + 双向链表(解决hash冲突)

2、如何保证有序性

3、解决hash重复(php使用的链表法):

4、基础知识

二、冒泡排序的时间复杂度和空间复杂度

1、代码实现

         $arr = [2, 4, 1, 5, 3, 6];         for ($i = 0; $i < (count($arr)); $i++) {             for ($j = $i + 1; $j < (count($arr)); $j++) {                 if ($arr[$i] <= $arr[$j]) {                     $temp = $arr[$i];                     $arr[$i] = $arr[$j];                     $arr[$j] = $temp;                 }             }         }     result : [6,5,4,3,2,1]

2、计算原理

平均时间复杂度:O(n^2)

最优时间复杂度:O(n) ,需要加判断,第一次循环如果一次都没有交换就直接跳出循环

空间复杂度:O(1),交换元素的时候的临时变量占用的空间

最优空间复杂度:O(1),排好序,不需要交换位置

3、时间复杂度和空间复杂度

时间复杂度:全程为渐进时间复杂度,估算对处理器的使用效率(描述算法的效率趋势,并不是指算法具体使用的时间,因为不同机器的性能不一致,只是一种效率计算的通用方法)

表示方法:大O符号表示法

复杂度量级:

时间复制类型:

空间复杂度:全程渐进空间复杂度,估算对计算机内存的使用程度(描述算法占用的存储空间的趋势,不是实际占用空间,同上)

三、网络七层协议及 TCP 和 TCP

应用层、表示层、会话层、传输层、网络层、(数据)链路层、物理层

记忆套路:

首字:应表会传(物链网)

第一个字:应用层(出现次数多,易忆)

前四个正向:应表 - 会传

后三个反向:物联网谐音比网链物更好记

四、TCP 和 UDP 的特点和区别

1、都是属于传输层协议

2、TCP

3、UDP(根据TCP特点反记)

五、TCP 的三次握手和四次挥手

1、三次握手:

2、四次挥手

注意:

六、HTTP 状态码

1、状态码分类  

2、常用状态码

3、502 的原因及解决方法

原因:nginx将请求提交给网关(php-fpm)处理异常导致

1)fastcgi 缓冲区设置过小

fastcgi_buffers 8 16k;

fastcgi_buffer_size 32k;

2)php-cgi的进程数设置过少

查看FastCgi进程数:netstat -anpo | grep "php-cgi"| wc -l

调整参数最大子进程数:max_children

一般按照单个进程20M计算需要需要设置的子进程数

3)max_requests(内存溢出或频繁重启)

参数指明每个children最多能处理的请求数量,到达最大值之后会重启children。

设置过小可能导致频繁重启children:

php将请求轮询给每个children,在大流量的场景下,每一个children 到达最大值的时间差不多,如果设置过小可能多个children 在同一时间关闭,nginx无法将请求转发给php-fpm,cpu降低,负载变高。

设置过大可能导致内存泄露

4)php执行时间超过nginx等待时间

fastcgi_connect_timeout

fastcgi_send_timeout

fastcgi_read_timeout

5)fastcgi执行时间

max_execution_time

七、http 和 HTTPS 的区别

端口:http 80; https :443

http无状态,https是有http + ssl构建的可进行加密传输的协议

http明文传输,https加密传输

http更快,三次握手三个包,https 需要12个包(3个tcp包+9个ssl握手包)

八、redis 分布式锁及问题

1、实现:

加锁:setnx

解锁:del

锁超时:expire

2、可能出现的问题

九、redis 的数据类型及应用场景

1、string :

普通的key/value存储

2、hash:

hashmap:键值队集合,存储对象信息

3、list:

双向链表:消息队列

4、set:

value永远为null的hashMap:无序集合且不重复:计算交集、并集、差集、去重值

5、zset:

有序集合且不重复:hashMap(去重) + skiplist跳跃表(保证有序):排行榜

十、redis 实现持久化的方式及原理、特点

1、RDB持久化(快照):指定时间间隔内的内存数据集快照写入磁盘      

1)fork一个子进程,将快照内容写入临时RDB文件中(dump.rdb),当子进程写完快照内容之后新的文件替换老的文件

2)整个redis数据库只包含一个备份文件

3)性能最大化,只需要fork子进程完成持久化工作,减少磁盘IO

4)持久化之前宕机可能会导致数据丢失

2、AOF持久化 :以日志的形式记录服务器的所有的写、删除操作

1)每接收到一个写的命令用write函数追加到文件appendonly.aof

2)持久化的文件会越来越大,存在大量多余的日志(0 自增100次到100,会产生100条日志记录)

3)可以设置不同的fsync策略

4)AOF文件太大之后会进行重写:压缩AOF文件大小

十一、秒杀设计流程及难点

1、静态缓存

2、nginx 负载均衡  

三种方式:DNS轮询、IP负债均衡、CDN

3、限流机制

方式:ip限流、接口令牌限流、用户限流、header动态token(前端加密,后端解密)

4、分布式锁

方式:

5、缓存数据

方式:

6、库存及订单

十二、防 sql 注入

过滤特殊字符

过滤数据库关键字

验证数据类型及格式

使用预编译模式,绑定变量

十三、事务隔离级别

1、标准的sql隔离级别实现原理

2、innodb的事务隔离级别及实现原理(!!和上面的不一样,区分理解一个是隔离级别 一个是!!事务!!隔离级别)

1)基本概念

2)事务隔离级别

十四、索引原理

索引就是帮助数据库高效查找数据的存储结构,存储再磁盘中,需要消耗磁盘IO

1、存储引擎

2、索引类型

十五、分表 (分库) 的策略

1、流程

评估容量和分表数量-> 根据业务选定分表key->分表规则(hash、取余、range)->执行->考虑扩容问题

2、水平拆分

3、垂直拆分

4、问题

十六、select 和 update 的执行流程

1、mysql 构成

2、select 执行过程

3、update执行过程

十七、binlog 的作用和三种格式

作用:

数据恢复

主从复制

格式(二进制文件):

1)statement

2)row

3)mixed

十八、主从同步(主从复制)的原理和问题及读写分离

1、解决的问题

2、支持的复制类型(binlog 的三种格式)

3、原理

1)基础概念

2)流程(主节点必须开启bin log功能,)

4、主从复制的模式

1)异步模式(默认方式)

2)全同步模式

3)半同步模式

4)server-id的配置和server-uuid

5、读写分离

1)基于代码实现,减少硬件开支

2)基于中间代理实现

3)主从延时

十九、死锁

1、产生的四个必要条件

2、解除死锁

二十、Mysql 优化大分页查询 limit 100000 (offset),10 (page_sie)

1、原因

mysql查询分页数据时不是直接跳过offset(100000),而是取offset + page_size  = 100000 + 10 = 100010条数据,然后放弃其掉前面的100000条数据,所以效率地下

2、优化方案

二十一、redis 缓存和 mysql 数据一致性

方式:

先更新redis 再更新数据库

 场景:update set value = 10 where value = 9

 1) redis更新成功:redis value = 10

 2)数据库更新失败:mysql value = 9

 3)数据不一致

先更新数据库,再更新redis

 场景: A进程update set value = 10 where value = 9 ;B进程 update set value = 11 where value = 9;

 1)A 进程先更新数据库,还未写入缓存:mysql value = 10 ;redis value = 9

 2)B 进程更新数据库并且提交事务,写入缓存:mysql value = 11;redis value = 11;

 3)A 进程处理完请求提交事务,写入缓存:redis value = 10;

 4)最终 mysql value = 11; redis value = 10

先删除缓存再更新数据库

场景:A进程update set value = 10 where value = 9 ;B进程查询value;

1)A 进程先删除缓存 还没来得及修改数据或者事务未提交

2)B 进程开始查询,没有命中缓存,所以查库并写入缓存 redis value = 9

3)A 进程更新数据库完成 mysql value = 10

4)最终 mysql value = 10;redis value = 9

解决方案:

延时双删除

场景:A进程update set value = 10 where value = 9 ;B进程查询value;

1)A 进程先删除缓存 还没来得及修改数据或者事务未提交

2)B 进程开始查询,没有命中缓存,所以查库并写入缓存 redis value = 9

3)A 进程更新数据库完成 mysql value = 10

4)A 进程估算延时时间,sleep之后再次删除缓存

5)最终mysql value = 10;redis value 为空(下次查询直接查库)

6)延时的原因时防止B进程在A进程更新完之后B进程还没来得及写入缓存

请求串行化

1)创建两个队列 :更新队列和查询队列

2)当缓存不存在需要查库的时候将key存入更新队列

3)如果查询未完成之前有新的请求进来,并且发现更新队列中还存在key则将key放入查询队列,则等待;不存在则重复第二步

4)如果查询的数据发现查询队列已经存在则不需要再次写入队列

5)数据更新完成之后rpop更新队列,同时rpop查询队列,释放查询请求

6)查询请求可以使用while + sleep  查询缓存并且设置最大延迟时间,还没有完成则返回空

二十二、redis 中的 connect 和 pconnect

1、connect             :脚本结束之后释放连接

close :释放连接

2、pconnect(长连接) :脚本结束连接不释放,连接保持在php-fpm进程中,生命周期随着php-fpm进程的生命周期

3、pconnect 的连接复用问题

二十三、redis zset 有序集合使用 skiplist 的原理

1、基本概念

skiplist是一个随机的数据,以有序的方式在层次化的链表中保存元素(只能用于元素有序的情况)

skiplist实在有序链表和多层链表的基础上演变的

允许重复值,所以对比检查除了要对比key 还要对比value

每个节点都带有一个高度为1的后退指针,用于表头方向到表尾方向的迭代

时间复杂度O(logn)、空间复杂度O(n)

2、跳跃表和平衡树的对比

1)范围查询效率

2)内存占用

3)插入和删除操作

二十四、redis 的过期删除和淘汰机制

1、常规过期删除策略

1)定时删除

2)惰性删除

3)定期删除

2、redis采用的 惰性删除 + 定期删除

3、淘汰策略(内存不足以写入新数据的时候执行)

二十五、redis 常见问题及解决方案

1、缓存雪崩:同一时间大量缓存失效,导致请求直接查询数据库,数据库内存和CPU压力增加甚至宕机

解决:

2、缓存穿透:缓存和数据库都没有数据,大量请求下,所有请求直接击穿到数据库,导致宕机。

解决:

3、缓存击穿:数据库中有数据,但是缓存突然失效之后发生大量请求导致数据库压力增加甚至打垮宕机

解决:

二十六、php-fpm 详解及生命周期

1、基础知识

1)CGI协议

2)CGI程序 = php-cgi

3)FastCGI协议

4)FastCGI程序  = php-fpm

2、php-fpm生命周期:待更新

二十七、Nginx 和 php 之间的通信

1、通信方式:fastcgi_pass

1)tcp socket

2)unix socket

到此,关于“PHP面试题基础知识有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯