面试问题汇总
1.之前用的技术栈

后台技术:redis,mysql,swoole
后端框架:thinkphp,laravel,yii,hyperf
前端框架:jQuery,vue,react,element-ui,antd,uniapp
语言:python

2.写sql要注意哪些东西
■避免select *,以及加上limit限制
■where条件尽量不要使用函数或者做运算之类的
■in或not in要慎用,会全表扫描
■like遵循最佳左前缀法则(左边不要使用%,有时候可以用到索引)
■联合索引,遵循最佳左前缀法则(左边不要使用%,有时候可以用到索引
■不要在索引列上做任何操作(索引列存在计算、函数、类型转换,会导致索引失效进行全表扫描。)
■is null 或 is not null可能会导致索引失效
■注意where,group by,order by后面的列,多表关联的列是否加索引
■尽量避免使用or(可用union all)

3.分库分表怎么设计
●水平分库分表
●垂直分库分表
●使用时间范围分表,hash分表,range分表

4.数据库读写分离有做过吗

执行sql时,如果是读操作则连接从服务器,如果是写操作则连接主服务器,通过binlog日志进行同步

一致性问题:
1.强制读主库
2.等待一段时间,比如业务侧写入后做活动拖住用户一段时间
3.查询延迟方案,通过show slave status中的seconds_behind_master进行描述,从库落后了主库数据多少秒,当这个参数为0时,我们可以认为从库和主库已经基本上没有延迟了,那么这时候就可以查询请求。
4.半同步复制方案
5.缓存标记法,写请求完成后缓存做标记,读请求先判断缓存标记,有走主库,没有走从库(有性能问题)
6.本地缓存法,用户A写请求完成后,通过cookie等技术缓存标记和过期时间到客户端,再次发起读请求时带上这个cookie

5.服务器用的apache还是nginx
6.nginx分布式负载均衡

nginx作中间服务器通过算法转发请求到应用服务器

作用:
转发功能
故障迁移
添加恢复

策略:
轮询(默认)
权重(weight)
ip_hash:按访问ip的hash结果分配,访客固定一台服务器,可解决session问题。
fair(第三方)按后端服务器响应时间分配
url_hash:按url的hash结果分配,对缓存时比较有效

客户端-反向代理层
dns轮询(一个域名配置多个ip,通过dns轮询均衡访问nginx反向代理层)

反向代理层-服务器站点层
通过nginx配置负载均衡

服务器站点层-服务层
通过连接池

服务层-数据层

7.有做过聊天的项目没

做过,使用环信之类的第三方api
自己通过websocket实现单聊和多聊。

8.怎么优化自己的代码
●尽量少创建变量
●尽量重用对象,不要循环创建对象
●echo效率高于print
●循环次数在循环前设置好,不要每次循环都动态计算
●尽量不要使用require_once和include_once
●最好不要使用@
●使用局部变量比对象属性快
●用单引号代替双引号
●尽量使用页面静态化
●使用缓存
●使用整型保存IP,使用ip2long()和long2ip()函数把IP地址转成整型后,再存放进数据库,而保存非字符型。这几乎能降低1/4的存储空间。同时可以很容易对地址进行排序和快速查找;
●连接数据库使用pdo或者mysqli,不要使用mysql_相关函数,已经不被建议使用了
●引用传递参数
●不要随便复制变量(变量复制到更简短的变量名)
●使用switch case,好于多个if else语句
●使用file_get_contents效率高于fopen相关函数
●foreach效率比while,for更高
●优化sql
●尽量使用php内部函数

9.怎么测试自己sql语句的效率

开启慢查询日志
使用explain关键词分析
查看线程运行状态 show processlist

10.sql执行流程优化
●应用连接数据库(引入连接池)
●验证执行权限
●语法解析器
●优化器(消耗最小化,索引简单,join,子查询少)
●扫表(可能阻塞)
●查询缓存
●运算
●返回(写入网络io)
●同步事务日志,释放锁

阔知
1.做php多久了
2.php的优缺点,什么特性导致了性能上的不足(请求进来之后每次初始化以后,第二次请求还是会初始化)
优点:
●流行,易上手,跨平台,成熟框架,成熟社区,大平台也在用
●可面向过程和面向对象编程
●使用成本低,开发速度快
缺点:
●多线程支持不好
●语法不太严谨
●php解释运行机制,运行完后资源被回收,无法让某个对象常驻内存
可通过swoole扩展实现

3.php-fpm进程怎么调度

FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,并等待来自 Web Server 的连接。
Web 服务器与 FastCGI 进程管理器进行 Socket 通信,通过 FastCGI 协议发送 CGI 环境变量和标准输入数据给 CGI 解释器进程。
CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。
CGI 解释器进程接着等待并处理来自 Web Server 的下一个连接。

FastCGI是一种协议,FPM是 FastCGI 的实现
FPM 是PHP FastCGI运行模式的一个进程管理器,php没有http处理库,而是实现了FastCGI协议,通过与web服务器配合实现http处理。

一般的处理模型:多进程、多线程,多进程模型通常是主进程只负责管理子进程,而基本的网络事件由各个子进程处理,nginx、fpm就是这种模式;另一种多线程模型与多进程类似,只是它是线程粒度,通常会由主线程监听、接收请求,然后交由子线程处理,memcached就是这种模式,有的也是采用多进程那种模式:主线程只负责管理子线程不处理网络事件,各个子线程监听、接收、处理请求,memcached使用udp协议时采用的是这种模式。FPM 的实现:创建一个 master 进程,在 master 进程中创建并监听 socket,然后 fork 出多个子进程,这些子进程各自 accept 请求,子进程的处理非常简单,它在启动后阻塞在 accept 上,有请求到达后开始读取请求数据,读取完成后开始处理然后再返回,在这期间是不会接收其它请求的,也就是说 FPM 的子进程同时只能响应一个请求,只有把这个请求处理完成后才会 accept 下一个请求,这一点与 nginx 的事件驱动有很大的区别,nginx 的子进程通过 epoll 管理套接字,如果一个请求数据还未发送完成则会处理下一个请求,即一个进程会同时连接多个请求,它是非阻塞的模型,只处理活跃的套接字。

4.从浏览器请求一直到服务器再返回的流程。

首先,在浏览器地址栏中输入url
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。
3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
5、握手成功后,浏览器向服务器发送http请求,请求数据包。
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到HTTP响应
8、读取页面内容,浏览器渲染,解析html源码
9、生成Dom树、解析css样式、js交互
10、客户端和服务器交互
11、ajax查询

5.nginx和fpm之间不是直接通过sapi通信,是通过什么协议(fastcgi)
6.面向对象三大特性,多态是怎么理解的

封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式

继承:对象的新类通过现有的父类派生,通过继承实现可重用性

多态:子类可以重写父类的方法,从而实现同一个接口,不同实例执行不同的操作。

7.面向对象接口和抽象类的区别
●抽象类可以有属性和普通的方法,接口不能
●抽象类中不一定要有抽象方法,接口一定有抽象方法
●抽象类使用abstract关键字声明,接口使用interface关键字声明
●抽象类是用extends关键字让子类继承父类后,在子类实现详细的抽象方法。而接口则是用implements让普通类在类里实现接口的详细方法,且接口可以一次性实现多个方法,用逗号分开各个接口就可

抽象类:一种特殊的类,可以在类中定义属性、普通方法、抽象方法,类似于模板,规范后让子类继承,实现详细的功能,使用abstract关键字声明。未必有抽象方法,抽象方法没有方法体

接口:基于方法的规范,让某个类组合多个方法形成新的类。不能有属性和普通方法
。一定有抽象方法。接口不是类,不能使用class声明,不需要abstract关键字声明,没有方法体。

接口实现多个接口,抽象类只能继承一个
他们都不能被实例化
接口更多是定义规范

8.依赖倒置原则

程序依赖于抽象,不要依赖于具体的实现

9.魔术方法中的析构方法

__sleep:序列化类前执行
__wakeup:反序列化类前执行
__invoke:函数形式调用类时执行
__tostring:将类以字符串形式输出时执行
__get:获取未定义的属性时执行
__set:给未定义的属性赋值时执行
__isset:给未定义的属性(或私有属性)使用isset时执行
__unset:给未定义的属性(或私有属性)使用unset时执行
__construct:
__destruct:
__call:调用不存在的方法时执行
__callStatic:调用不存在的静态方法时执行
__clone:调用克隆方法时执行

10.序列化一个对象后,要反序列化,然后有一些属性自动更新,怎么做。

__wakeup

11.常用的数组函数
12.array_map和array_walk的区别

array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。当传递多个参数,函数接收也要对应数量的参数

array_walk() 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。如果成功则返回 TRUE,否则返回 FALSE。可使用引用传值改变原数组的值

13.函数和语句的区分,isset和empty的区别,变量a为null,分别输出什么(isset输出false,empty输出true)

isset 变量是否被赋值
empty 被赋值的变量是否为空

14.mysql数据类型,char和varchar后面的括号里的数字是表示字符数还是字节数

字符数

15.varchar和char的区别

1.char类型的长度是固定的,varchar的长度是可变的。
2.char类型的效率比varchar的效率稍高
3.varchar比char节省空间,但是在效率上比char稍差些。
4.当列经常被修改,且数据长度每次不同,会引起行迁移现象,这时使用char好一些

16.存储引擎myisam和innodb的区别
●MyISAM 只有表级锁,而 InnoDB 支持行级锁和表级锁,默认为行级锁
●MyISAM 不提供事务支持,InnoDB 提供事务支持
●MyISAM 不支持外键,而 InnoDB 支持

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性。
MySQL InnoDB 引擎通过 锁机制、MVCC 等手段来保证事务的隔离性( 默认支持的隔离级别是 REPEATABLE-READ )。
保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。

17.innodb下建立索引,索引类型有哪些

innodb使用聚簇索引检索数据页
聚簇索引指的是这样的数据组织结构:索引B+树的每个叶子节点直接对应了真实的Data Page。并且B+树所有的叶子节点在最底层共同描述了一个可以直接进行行数据顺序扫描的Data Page结构。

非聚簇索引(非聚集索引)
非聚族索引首先也是一颗B+树,只是非聚簇索引的叶子节点不再关联具体的Data Page信息,而是关联另一个索引值。

InnoDB会首先使用非聚簇索引检索出对应的主键信息,然后再通过主索引检索这个主键对应的数据

主键索引:(聚簇索引)
唯一索引:
普通索引:(非聚簇索引)
复合索引:将条件顺序按找索引的顺序效率最高;
哈希索引:字典类型查询非常快,范围查询无能为力
全文索引:一般都是基于倒排索引来实现,在辅助表中存储了单词与单词自身在一个或多个文档中所在位置的映射,使用like查询时,可使用全文索引。

18.建立一张表,有一个季节字段,是否需要加索引
● 较频繁的作为查询条件的字段应该创建索引
●唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
●更新非常频繁的字段不适合创建索引
●不会出现在 WHERE 子句中的字段不该创建索引

19.innodb扫描索引的时候有一个回表:innodb是一种聚族索引,扫描索引后拿到主键,再通过主键到聚簇索引里找数据
20.工作中哪些地方用到了事务

事务的四大特性
原子性:事务是一个不可分割的操作单位,事务中的所有操作要么全部成功,要么全部失败。
一致性:一致性和原子性密切相关。
隔离性:并发执行多个不同的事务之间是互不干扰的。
持久性:事务一旦提交,对数据库操作的影响是具有持久性的。

21.一致性是什么,几条sql一起执行是体现什么特性(原子性)

数据库从一个状态到达另一个状态,数据前后状态要正确

22.单表或单机总是有极限的,怎么扩展mysql。

分库分表,主从同步,读写分离

垂直分库:以表为依据,根据业务将不同表拆分到不同库中。特点:①每个库的表结构都不一样;②每个库的数据也不一样;③所有库的并集是全量数据。

垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。特点:①每个表的结构都不一样;②每个表的数据也不一样,一般通过一列(主键/外键)关联;③所有表的并集是全量数据。

水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。特点:①每个库的表结构都一样;②每个库的数据都不一样;③所有库的并集是全量数据。

水平分表:以字段为依据,按照一定的策略,将一个表的数据拆分到多个表中。特点:①每个表的表结构都一样;②每个表的数据都不一样;③所有表的并集是全量数据。下图为水平分表。

23.读写分离怎么实现的

主从复制:主数据库有写操作,从数据库自动同步。从数据库通过I/O线程去请求主数据库的binlog日志文件(二进制日志,包含SQL的增删改查等,用来做备份恢复等),并写到中继日志中,SQL线程会读取中继日志,并解析成具体操作同步数据到从数据库。

读写分离:数据库层面:主数据库负责写,从数据库负责读。软件(代码)层面:通过读写分离中间间,比如MyCat、shardingsphere等实现。

24.redis和memcached的区别
●memcached只支持简单数据类型,redis支持多种数据类型
●memcached存储大数据性能好于redis
●redis只支持单核
●redis支持持久化(RDB快照和AOF),memcache不支持


25.redis有哪些数据类型
26.redis得到两万用户的实时积分排名,使用哪种类型。

有序集合

27.redis实现分布式锁,怎么实现

使用set命令加上nx和过期时间

28.redis持久化的原理

RDB:将数据快照按照配置的策略定期保存到磁盘,速度更快。
AOF:将执行命令保存到文件,安全性更高。

29.linux查看日志前十行或者后十行

tail -n 10 filename

30.nginx配置负载均衡怎么做

在nginx配置文件中增加upstream name
在server中配置反向代理到负载均衡服务上

实现负载均衡的几种方式
轮询
weight权重
ip_hash
最少连接

人事
1.上两家公司时间不长的原因
2.目前找工作考虑的维度
3.自己的个人诉求,希望这家公司能带给自己什么东西。重点考虑哪些问题。
4.自己的技术沉淀处于什么样子的。
5.来之前对我们公司有了解过吗
6.之前薪资待遇,期望薪资
7.对自己的一个规划
8.两年的个人职业规划,有方向吗?
9.专业性方面提升
10.之前有带过团队吗?管人困难吗
11.个人偏什么性格
12.有学习计划吗?有没有在行动
13.平时学习主要哪些平台
14.其他有什么想了解的吗
15.黑客马拉松
16.对公司的要求

海瑞恩
1.怎么评价yii和tp的差异
2.学生表里有一个人的学号重复了,如何用一句sql找出重复的学生信息
select count(1) as num form student group by idcard having num>2

3.对自己有什么规划或者想法
想找个什么样的行业,什么样的公司
影响你做决定的因素有哪些
工资结构是怎么构成的。

五福云
1.varchar和char最大定义长度是多少
char:0-255,最大长度255个字符
varchar:0-65535个字节,如果编码为utf8,每个字符占用3个字节,最大长度为65535/3=21845长度的字符

2.title varchar (100) 字符集用utf8,存中文最大可以存多少字符

100个

3.获取手机号前七位

substr ($phone,strpos($phone,1),7)

4.在开发时如何防止刷短信验证码
●时间限制,一分钟不能再次发送,一小时不能超过5次,24小时不能超过10次
●token参数效验
●图形验证码
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇