前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >php开发工程师面试题知识点总结(四)--高级篇

php开发工程师面试题知识点总结(四)--高级篇

作者头像
码农编程进阶笔记
发布于 2021-07-20 08:11:26
发布于 2021-07-20 08:11:26
48100
代码可运行
举报
运行总次数:0
代码可运行

并发处理

进程(Process)

是计算机中程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单元,是操作系统结构的基础。进程是一个执行中的程序

进程的三态模型:运行、就绪、阻塞

进程的五态模型:新建态、活跃就绪/静止就绪、运行、活跃阻塞/静止阻塞、终止态

  1. 新建态:对应于进程刚刚被创建时没有被提交的状态,并等待系统完成创建进程的所有必要信息
  2. 终止态:进程已结束运行,回收除进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息。
  3. 活跃就绪:是指进程在主存并且可被调度的状态。
  4. 静止就绪(挂起就绪):是指进程被对换到辅存时的就绪状态,是不能被直接调度的状态,只有当主存中没有活跃就绪态进程,或者是挂起就绪态进程具有更高的优先级,系统将把挂起就绪态进程调回主存并转换为活跃就绪。
  5. 活跃阻塞:是指进程已在主存,一旦等待的事件产生便进入活跃就绪状态。
  6. 静止阻塞:进程对换到辅存时的阻塞状态,一旦等待的事件产生便进入静止就绪状态。

线程

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。

在单个程序中同时运行多个线程完成不同的工作,称为多线程。

协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

区别

线程与进程

  1. 线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
  2. 进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
  3. 线程是处理器调度的基本单位但进程不是
  4. 二者均可并发执行
  5. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

协程和线程

  1. 一个线程可以多个协程,一个进程也可以单独拥有多个协程
  2. 线程进程都是同步机制,而协程则是异步
  3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

例子

  1. 单进程单线程:一个人在一个桌子上吃菜
  2. 单进程多线程:多个人在同一个桌子上一起吃菜
  3. 多进程单线程:多个人每个人在自己的桌子上吃菜

同步阻塞

多进程模式

  1. 创建一个 socket
  2. 进入 while循环,阻塞在进程accept操作上,等待客户端连接进入主进程在多进程模型下通过fork刨建子进程
  3. 收到数据后服务器程序进行处理然后使用send向客户端发送响应
  4. 当客户端连接关闭时,子进程/线程退出并销毁所有资源。主进程/线程会回收掉此子进程/线程。

多线程模式

  1. 多线程模型下可以创建子线程
  2. 子进程/线程创建成功后进入while循环,阻塞在recv调用上,等待客户端向服务器发送数据
  3. 收到数据后服务器程序进行处理然后使用send向客户端发送响应
  4. 当客户端连接关闭时,子进程/线程退出并销毁所有资源。主进程/线程会回收掉此子进程/线程。

缺点

  1. 这种模型严重依赖进程的数量解决并发问题
  2. 启动大量进程会带来额外的进程调度消耗

异步非阻塞

现在各种高并发异步IO的服务器程序都是基于epoll实现的

IO复用异步非阻塞程序使用经典的Reactor模型,Reactor顾名思义就是反应堆的意思,它本身不处理任何数据收发。只是可以监视一个 socket句柄的事件变化

reactor模型

  • Add:添加一个 SOCKET到 Reactor
  • Set:修改 SOCKET对应的事件,如可读可写
  • Del:从 Reactor中移除
  • Callback:事件发生后回调指定的函数

常见reactor模型

  1. Nginx:多线程 Reactor
  2. Swoole:多线程 Reactor+多进程Worker

数据库缓存

mysql查询缓存

查询缓存可以看做是SQL文本和查询结果的映射,第二次查询的SQL和第一次查询的SQL全相同,则会使用缓存

表的结构或数据发生改变时,查询缓存中的数据不再有效

配置:

query_cache_type

查询缓存类型,有0、1、2三个取值。0则不使用查询缓存。1表示始终使用查询缓存。2表示按需使用查询缓存。

query_cache_size

默认情况下 query_cache_size 为0,表示为查询缓存预留的内存为0,则无法使用查询缓存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET GLOBAL query_cache_size= 134217728

使用

querycache_type 为1时,亦可关闭查询缓存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT SQL_NO_CACHE FROM my_table WHERE condition;

query_cache_type 为2时,可按需使用查询缓存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT SQL_CACHE FROM my_table WHERE condition;

其他

查看命中次数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SHOW STATUS LIKE'Qcache_hits';

清理缓存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FLUSH QUERY CACHE∥清理查询缓存内存碎片
RESET QUERY CACHE∥从查询缓存中移出所有查询
FLUSH TABLES;//关闭所有打开的表,同时该操作将会清空查询
缓存中的内容

redis / memcache 缓存

  • Redis,依赖客户端来实现分布式读写
  • Memcache本身没有数据冗余机制
  • Redis支持(快照、AOF),依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响
  • Memcache不支持持久化,通常做缓存,提升性能;
  • Memcache在并发场景下,用cas保证一致性, redis事务支持比较弱,只能保证事务中的每个操作连续执行
  • Redis支持多种类的数据类型
  • Redis用于数据量较小的高性能操作和运算上
  • Memcache用于在动态系统中减少数据库负载,提升性能;适合做缓存,提高性能

mysql 优化

数据表数据类型优化

  • tinyint、 smallint、 bigint 考虑空间的问题,考虑范围的问题
  • char、varchar
  • enum 特定、固定的分类可以使用enum存储,效率更快
  • ip地址 ip2long() 转成长整型存储

索引优化

索引创建原则

  • 索引不是越多越好,在合适的字段上创建合适的索引
  • 复合索引的前缀原则

索引注意事项

  • 复合索引的前缀原则
  • like查询%的问题
  • 全表扫描优化
  • or条件索引使用情况
  • 字符串类型索引失效的问题

SQL语句的优化

优化查询过程中的数据访问

  • 使用 Limit
  • 返回列不用*

优化长难句的查询语句

  • 变复杂为简单
  • 切分查询
  • 分解关联查询

优化特定类型的查询语句

  • 优化 count()
  • 优化关联查询
  • 优化子查询
  • 优化 Group by和 distinct
  • 优化 limit和 union

存储引擎的优化

尽量使用 Inno DB存储引擎

数据表结构设计的优化

分区操作

  • 通过特定的策略对数据表进行物理拆分
  • 对用户透明
  • partition by

分库分表

  • 水平拆分
  • 垂直拆分

数据库服务器架构的优化

负载均衡

  • 通过LVS的三种基本模式实现负载均衡
  • MyCat数据库中间件实现负载均衡

web服务器的负载均衡、请求分发

七层负载均衡实现

基于URL等应用层信息的负载均衡

Nginx的 proxy是它一个很强大的功能,实现了7层负载均衡

nginx负载均衡

优点

功能强大,性能卓越,运行稳定

配置简单灵活

能够自动剔除工作不正常的后端服务器

上传文件使用异步模式

支持多种分配策略,可以分配权重,分配方式灵活

Nginx负载均衡策略

内置策略: IP Hash、加权轮询

扩展策略:fair策略、通用hash、一致性hash

加权轮询策略

首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器

当所有后端机器都down掉时,Ngnx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在 timeout的状态

IP Hash策略

Nginx内置的另一个负载均衡的策略,流程和轮询很类似,只是其中的算法和具体的策略有些变化

IP Hash算法是一种变相的轮询算法

fair策略

根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流

通用Hash、一致性Hash策略

通用hash比较简单,可以以 Nginx内置的变量为key进行hash,

一致性hash采用 Nginx了内置的一致性hash环,支持 memcache

配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http {
    upstream cluster {
        server srvl;
        server srv2;
        server srv3;
    }
    server {
        listen 80;
        location /
        proxy_pass http: //cluster;
    }
}

四层负载均衡实现

通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器

LvS实现服务器集群负载均衡有三种方式,NAT,DR和TUN

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农编程进阶笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP面试-复习知识点整理
php.ini 中打开 allow_url_fopen 配置,http协议只能使用只读,ftp协议,只能只读或只写
全栈程序员站长
2022/07/11
1.1K0
深入探讨 “高并发大流量” 访问的解决思路和方案
怎么解决高并发大流量问题?下面本篇文章就来给大家分享下高并发大流量 web 解决思路及方案,希望对大家有所帮助!
PHP开发工程师
2022/05/12
1.2K0
服务器高并发负载解决方案
web资源防盗链 盗链是什么? 为什么要防? 在自己页面上显示一些不是自己服务器的资源(图片、音频、视频、css、js等) 由于别人盗链你的资源会加重你的服务器负担,所以我们需要防止 可能会影响统计 防盗链是什么? 有哪几种方式? 防止别人通过一些技术手段绕过本站的资源展示页,盗用本站资源,让绕开本站资源展示页面的资源链接失效 大大减轻服务器压力 1、Referer (易伪造referer,安全性低) 2、加密签名 (安全性高) 防盗链的工作原理 通过Referer,服务器可以检测到访问目标资
黄啊码
2020/05/29
2.4K0
服务器高并发负载解决方案
php开发工程师面试题知识点总结(三)--中级篇
内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
码农编程进阶笔记
2021/07/20
6120
史上最全的中高级JAVA工程师-面试题汇总
memcached 虽然称为 “ 分布式 ” 缓存服务器,但服务器端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。 memcached 的分布式,则是完全由客户端程序库实现的。 这种分布式是 memcached 的最大特点。
全栈程序员站长
2022/07/01
5060
史上最全的中高级JAVA工程师-面试题汇总
2021年最新大厂php+go面试题集(三)
14.快手一面 1.CDn工作原理 答:CDN通过广泛的网络节点分布,提供快速、稳定、安全、可编程的全球内容分发 加速服务,支持将网站、音视频、下载等内容分发至接近用户的节点,使用户可就近 取得所需内容,提高用户访问的响应速度和成功率。 https://blog.csdn.net/aliyunbaike/article/details/84952966 2.go的init用过吗,主要使用场景是哪些? 答:每一个源文件都可以包含一个 init 函数,该函数会在 mai
码农编程进阶笔记
2021/09/29
6130
百度php面试题之 – 高级php工程师篇
阅读量: 163 一 算法 基本排序算法要会写,时间复杂度要会推算, 主要是冒泡排序, 快速排序, 选择排序. 查找算法,要会写二分查找法, 实际场景要会应用. 实例算法思路要明白,基本算法看多了, 我觉得是几种思路的变换, 需要自己领悟. 面试中考过: 猴子选大王 斗地主项目设计 实现随机函数 字符串中元素各种变形查找 123456 六个数放到三角形三个顶点及中点上,使每条边上的数字和相等 一个超大文件里面存放关键,统计每个关键的个数, 问如何实现 一个10G的文件,里面存放关键字, 但内存只有1
李昂君
2021/12/24
1.1K0
百度php面试题之 – 高级php工程师篇
2021年最新大厂php+go面试题集(二)
微信公众号:码农编程进阶笔记 关注可获得更多的视频教程及面试技巧。问题或建议,请公众号留言!
码农编程进阶笔记
2021/09/29
6470
2020年PHP中级面试知识点及答案[通俗易懂]
      最近博主也是历尽千辛万苦换了份工作,每次换之前不找点面试题看似乎就没自信一样。。奈何网上有些面试题是比较老套的,所以这里重新总结一份2020年的,题目是有些是博主自己不熟悉的点,有些是boss直聘论坛找到的,有的是朋友的面试经历,仅作为记录。
全栈程序员站长
2022/02/18
1.1K0
架构设计-高性能篇
大家好,我是易安!今天我们谈一谈架构设计中的高性能架构涉及到的底层思想。本文分为缓存架构,单服务器高性能模型,集群下的高性能模型三个部分,内容很干,希望你仔细阅读。
架构狂人
2023/08/16
4410
架构设计-高性能篇
Java高级开发工程师,面试总结
Java高级开发工程师,面试总结 每个人都会有的抉择 时隔两年,再一次的面临离职找工作,这一次换工作有些许的不舍,也有些许的无奈。个人所在的技术团队不错,两年时间成长了很多,也很不舍这个团队。但是,由于公司的某些原因和对于自身未来发展的综合考虑,又不得不得离去,去寻找更合适的地方成长和发展。相比于两年前,现在找工作没有那么的着急,也没有那么的迫切,也没有特别想去的公司,反正去大厂互联网公司基本都是加班加点的。也许,这是工作三年的我即将面临的一个坎吧。对于未来的选择和考虑,对于未来的恐惧吧。也许我是杞人忧天,
Java帮帮
2018/03/19
9190
[日常] 面试知识点总结(持续更新)
数据结构和算法: 物理结构和逻辑结构 1.逻辑结构(集合结构,线性结构,树形结构,图形结构) 2.物理结构一般是讲内存,顺序存储结构,链式存储结构 浅谈算法中,高斯算法从1加到100,循环的话是100次,高斯的方法只需要一次 1.推导大O阶:O(1) O(n) O(n^2) O(logn) 1.常数1取代时间所有加法常数 2.只保留最高项 3.去除项相乘的常数,去掉系数
唯一Chat
2019/09/10
5K0
Tomcat面试题+http面试题+Nginx面试题+常见面试题
1、Tomcat的缺省端口是多少?怎么修改? 答:缺省端口是8080,若要修改,可以进入Tomcat的安装目录下找到conf目录下的server.xml文件,找到该文件中的Connector字段中的port。 2、Tomcat有哪几种connector运行模式(服务的请求方式)? 答:三种。修改它的运行模式需要在主配置文件中找到connector字段中的protocol进行修改
全栈程序员站长
2022/09/02
1.4K0
技术角 | 架构学习书摘总结(二)高性能架构模式
最近阅读了一本架构方面的入门图书叫《从零开始学架构:照着做,你也能成为架构师》,部分内容比较不错,先做书摘总结,以便加深印象与未来回顾学习。
ZNing
2020/05/13
7080
2020Java高级开发工程师面试题汇总
9.5–11.13,经过了长达70天的面试,终于有了结果。期间崩溃过无数次,很多次面试都被虐到怀疑人生,也有三面被刷掉无奈,一次次整装重新出发,一次次从头再来。今天有时间整理最近面试过程中涉及到的问题和经验,希望可以帮助到正在面试中或即将面试的同行们。
全栈程序员站长
2022/09/03
1K0
Linux运维工程师面试题(3)
可以,禁用iptables并不会影响LVS的使用。LVS是在Linux内核层面实现的负载均衡技术,其底层并不依赖于iptables进行流量转发。LVS使用IP隧道或网络地址转换(NAT)等技术将来自客户端的流量转发到后端服务器上,而不依赖于iptables规则。
阿贤Linux
2023/08/28
5380
Linux运维工程师面试题(3)
2019 C++开发工程师面试题大合集
头文件的引用顺序对于程序的编译还是有一定影响的。如果要在文件a.h中声明一个在文件b.h中定义的变量,而不引用b.h。那么要在a.c文件中引用b.h文件,并且要先引用b.h,后引用a.h,否则汇报变量类型未声明错误,也就是常见的某行少个“;”符号。
范蠡
2019/06/10
1.8K0
2019 C++开发工程师面试题大合集
详解高级PHP工程师面试题
这里想要给大家分享一下自己使用过程中产生的疑惑,以及解决的这些疑惑的过程。话又说回来,我现在依然充满疑惑。真不知道30岁的时候会不会不惑。
全栈程序员站长
2022/07/11
6180
详解高级PHP工程师面试题
架构设计之二——高性能架构
•主从复制延迟•写操作后的读操作指定发给数据库主服务器•读从机失败后再读一次主机•关键业务读写操作全部指向主机,非关键业务采用读写分离•分配机制•程序代码封装 如 TDDL•中间件封装 如 MySQL Router
aneutron
2022/08/19
5020
详解高级PHP工程师面试题
这里想要给大家分享一下自己使用过程中产生的疑惑,以及解决的这些疑惑的过程。话又说回来,我现在依然充满疑惑。真不知道30岁的时候会不会不惑。
码农编程进阶笔记
2021/07/20
5580
相关推荐
PHP面试-复习知识点整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验