php《面试》技巧总结
1、LAMP/LNMP是什么?区别是什么?
LAMP环境搭建:linux中安装Apache服务器,MYSQL数据库服务器和PHP开发服务器,
LNMP环境搭建linux中安装Nginx服务器,MYSQL数据库服务器和PHP开发服务器
Ningx性能稳定、功能丰富、运维简单、处理静态文件速度快且消耗系统资源少
Nginx是一个高性能的http和反向代理
1、相比Apache,用Nignx作为Web服务器,使用资源少,支持更多的并发连接,效率高。
2、作为负载均衡服务器:Nignx支持Http代理服务器对外进行服务
Apache开源、稳定、模块丰富是Apache的优势。但Apache的缺点 内存和CPU开销大,性能上有损耗
2、MVC分别那三层,有什么优点?
M:业务模型层
V:视图层
C:控制器层
耦合性低:
视图层和业务模型层分离,允许更改视图层代码而不用重新编译模型层和控制层的代码
重用性高、生命周期成本低、部署快、可维护性高、有利于工程化管理。
3、Mysql数据库优化
1、选取合适的字段属性
2、数据库索引
3、进行分表:水平分表、垂直分表
4、读写分离:主从同步
5、事务
6、使用外键
4、Laravel框架的优势
命令行工具,很多手动的工作都自动化
ORM操作系统
测试功能也很强大
Composer的运用
拥有大量的设计模式
开发很方便,比如数据验证、队列、缓存、数据迁移、测试、artisan命令行
5、PHP
Php独特混合了C、JAVA、Prell以及PHP自创的语法
支持几乎所有流行的数据库以及操作系统
PHP可以使用C、C++进行程序的扩展
更快的执行动态网页,程序嵌入到html去执行,效率更高
优势:
开放源代码、免费行、快捷性、跨平台、效率高、图形处理、面向对象、专业专注
技能应用:
支持MVC、静态页面生成、数据库缓存、过程缓存、大负荷、分布式
6、Laravel框架
Laravel是一个开源PHP框架,功能强大
模块化的包装
依赖管理器完全基于composer composer.json文件中记录
优雅的ORM 表示 对象–关系映射的缩写
查询构造器作为潜在的ORM替代
内置身份验证机制和缓存机制
一流的路由功能和选项
Laravel 与 TP 区别
TP框架:
ThinkPHP简单、快速,基于MVC和面向对象,易用性较高,是一款简洁实用的轻量级框架。
Laravel框架:
Lavavel一直秉承着优雅的原则,很好的支持了composer,实现了更丰富的扩展,社区文档活跃,相较于TP,Lavavel更庞大,安全性也更高,更适合开发大中型项目,被称为“巨匠型开发框架”。
7、nginx与php交互
①用户将http请求发送给nginx服务器(进行三次握手连接)
②nginx会根据用户请求的URL和后缀对请求进行判断
③用户如果请求的动态内容,nginx会将请求发送给fastcgi客户端,通过fastcgi_pass将用户的请求发送给php_fpm
如果用户访问的是静态文件,nginx直接将用户请求的静态资源返回给用户
④wrapper收到php_fpm转过来的请求后,wrapper会生成一个新的线程调用app动态程序解析服务器
⑤php会将查询到的结果返回给nginx
⑥nginx构造一个响应报文将结果返回给用户
8、Apache与php交互
模块方式、cgi方式、fastcgi/fpm
9、数据库设计三范式
第一范式:用来确保每列的原子性,确保每列或者每个属性值都是不可拆分的最小单元
第二范式:要求表中的每列都和主键相关,即要求实体的唯一性
第三范式:确保每列都和主键列直接相关,而不是间接相关,即限制列的冗余性
10、三次握手、四次挥手
三次握手:
第一次握手:客户端发送标志进行建立连接,随机产生seq=x数据包到服务器,服务器有SYN知道客户端要求建立连接
第二次握手:服务器收到请求后要确认联机信息,向客户端发送,产生seq=y的包,接收到请求,并且向客户端再次进行确认。
第三次握手:客户端手袋检查ack是否正确,即第一次放松的seq=1,以及位码ACK是否为1,代表收到了服务器端发过来的确认信息。之后客户端再次向服务器发哦那个ACK=1,服务器收到确认ack与ACK=1,连接成功。
四次挥手:
11、为什么连接的时候式三次握手,关闭的时候式四次握手?
因为当时客户端发过来关闭连接的请求时,发出的是FIN,仅代表客户端没有向服务端发送的数据了,而如果服务器如果仍有数据要发送给客户端的话,相应报文ACK和FIN则就不能同时发送给客户端,此时,服务器端会先返回一个响应报文,代表接受了客户端的FIN请求,而后在数据传输完成后,再发送FIN请求,表示服务端已经准备好断开连接了,所以关闭连接的是时候四次握手。
12、InnoDB与MyISM区别
1、InnoDB支持事务,MyISAM不支持事务。
2、InnoDB支持外键,而MyISAM不支持
3、InnoDB是行锁,MyISAM是表锁。
4、InnoDB不支持索引,MyISAM比InnoDB查询速度快
13、sql语句的优化
1、对查询语句进行优化,避免全表扫描。
2、尽量避免再where子句中对字段进行NULL值判断,创建表时NULL是默认值
3、尽量避免再where子句中使用!=或<>操作符。
4、尽量避免再where子句中使用OR来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
5、IN和NOTIN也要避免使用,否则导致全表扫描。
6、避免再where子句中使用参数,也会导致全表扫描
7、避免再where子句中对字段进行表达式操作,尽量避免再where子句中对字段进行函数操作。
8、尽量避免客户段返回大数据量。
9、索引的使用规范
14、数据库索引的优化
1、like语句的前导模糊查询不使用索引
2、负向条件查询不能使用索引
3、范围右边的列不能使用索引
4、在索引列做任何操作(计算、函数、表达式)会导致索引失效而转向全表扫描
5、where子句中索引列使用参数,也会导致索引失效
6、强制类型转换会导致全表扫描
7、使用组合索引时,要符合最左前缀
8、利用覆盖索引来进行查询操作,避免回表,减少select * 操作
15、Redis数据类型及应用场景?
String(字符串)日志 、 用户信息
Hash(哈希)用户信息、手机号
List(列表)关注列表、粉丝列表
简单的字符串列表,按照插入顺序排序
Set(集合)点赞 收藏
Zset(有序集合) 排行榜
16、Redis与Memcache区别?
redis与memcahce基于内存的数据存储系统
memcahce是高性能分布式内存缓存服务
redis是开源的key-value数据库
1、数据操作不同
Memcahced支持简单key-value结构数据,不支持枚举、不支持持久化和复制等功能,
redis:支持持久化和复制等功能(字符串、哈希、有序集合、集合、列表,)
2、性能不同
Redis只使用单核,memcahed可以使用多核
Redis每一个核上redis在存储小数据时比memcached性能更高、而在100k以上的数据中,memcahced性能高于reids
3、集群管理不同
Memcahced是全内存的数据缓冲系统
reids虽然支持数据持久化,但是全内存毕竟才是其高性能的本质
Redis偏向于在服务器端构建分布式存储
17、PHP设计模式
单列模式:
实例化一次 将数据存储在内存中 连接数据库,只能连接一次,防止造成一些影响
程序中最多只有该类的一个实例存在,一旦被创建,就一直存在内存中。
常用于数据库类的设计,之连接一次数据库,防止打开多个数据库 的连接。
工厂模式:
对象和类存储在工厂中,用的时候直接调用
调用对象与创建对象分离,调用者直接向工厂进行请求,减少代码的耦合性提高系统的维护性和扩展性
如果你想更改所实例化的对象等,只需要更改工厂中的方法内容即可,不需要在代码中具体实例化的地方修改。
观察者模式:
是定义对象间的一种一对多的依赖关系,以便对象的状态发生变化时,所有依赖它的对象都得到通知并自动刷新。
策略模式:
定义一系列的算法,把每一个算法封装起来,并使他们可互相替换。
本模式使得算法可独立于使用它的客户而变化,策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。
适配器模式:
将一个类的接口,转换成客户期望的另一个接口,适配器让原来接口不兼容的类可以合作无间
减少代码的耦合性。
注册模式:
通常将对象实例注册到一颗全局的对象树上,需要的时候从对象树上采摘的模式设计。
18、防止SQL注入
1、绝对不要相信用户输入的任何东西
2、预编译。现在的框架一般都会有SQL过滤的
3、SQL语句书写尽量不要省略小引号和单引号
4、过滤sql语句中的一些关键字:update、insert、delete、select、*
5、提高数据库和字段的命名技巧
6、关闭全局变量注册
7、控制错误信息,不要再浏览器输出错误信息,将错误信息写入日志中
19、对大流量网站解决问题
1、确认服务器硬件是否能够支持当前的流量
2、数据库读写分离、优化数据表
3、程序功能规则、禁止外部的盗窃连
4、控制大文件的下载
5、使用不同主机分流
20、数组函数
array()—-创建数组
array_search()—-在数组中搜索给定的值
shuffle()—-把数组中的元素按随机顺序重新排列
array_unique()—-移除数组中重复的值
Array_diff 比较两个数组的差异
Array_intersect 获取两个数组的交集
Array_flip 数组键值的互换
Array_value 包含数组中所有的值的数组
Substr字符串截取 (字符串 开始位置的下标 截取的长度)
Str_replace字符串替换(查找的字符 要替换谁 原字符窜)
Str_repeat重复字符窜(要重复的内容 重复的次数)
Str_split字符串转化为数组(原字符窜 每个数组项的长度)
Explode分割数组(‘符号’ 原字符串)
array_column — 返回数组中指定的一列
implode数组转字符串
Array_merge 数组合并
Array_value 包含数组中所有的值的数组
21、字符串函数
Strtoupper 把字符串转换为大写
Strtolower 把字符串转换为小写
Ucfirst 把首字母大写
Strtev 反转字符串
Strpos 返回参数在字符串首次出现的位置
Strrpos 返回参数在字符串最后出现的位置
长连接和短连接的区别:
长连接与短连接:长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。
短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。
22、什么是跨域,如何解决?
跨域是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同
解决办法:
1、JSONP
使用方式就不赘述了,但是要注意的是JSONP只支持GET,不支持POST
2、代理
绕过浏览器
3、PHP端修改header
PHP接口脚本中加入两句header头
23、PHP是什么?
超文本预处理器,是一种广泛应用的开放源代码的多用途脚本语言。
24、消息队列
先进先出的数据结构 要传输的数据放在队列中
25、Redis应用场景
特点:读写性能优异、持久化、数据类型丰富、数据自动过期、发布订阅、分布式
26、数据库分区分库
分库分表就是按照一定的规则,对原有的数据库和表进行拆分,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储待多个表上
27、为什么分库分表?
随着业务和时间的发展,数据库中的数据量增长,库和表中的数据会越来越大,随之带来的是更高的磁盘、IO、系统开销,甚至性能上的瓶颈。而一台服务器资源终究是有限的,因此需要对数据库和表进行拆分,从而提供更好的数据服务
28、分库分表的方式:垂直分表 、水平分表
垂直分表 :
商品、订单、用户的表分别划分出一个库,通过降低单库表的大小提高性能,但这种方式并没有解决搞数据量带来的性能损耗。分表的情况就是将一个大表业务功能拆分成一个个子表。例如用户表可以根据业务分成基本信息和详细信息表等。
优缺点:
1、拆分后业务清晰,达到转库专用
2、可以实现冷热数据的分离,将不经常变化的数据和变动较大的数据分散再不同的库/表中
3、便于维护
缺点:
1、不解决数据量大带来的性能损耗,读写压力一九很大
2、不同的业务无法跨库关联,只能通过业务来关联
水平分表
根据时间和ID序列值进行拆分,比如根据年份来拆分不同的数据库,每个数据库结构不一致,但是数据得以拆分,从而提升性能。又比如根据用户ID的值,根据规则分成若干个表。每个表结构不一致。与垂直分库分表相反
优缺点:
1、单库表的数据量以减少,提高性能
2、提高了系统的稳定性和负载能力
3、切分出的表结构相同,程序改动较少
缺点:
1、拆分规则较难抽象
2、数据分片的扩容时需要迁移
3、维护量大
4、依然存在跨库无法join等问题,同时涉及分布式事务,数据一致性等问题
29、高并发怎么发生,怎么去优化?
前端优化
CDN加速节点
减少HTTP的请求
反向代理
后端的优化
静态资源缓存在浏览器中
分库分表
负载均衡
高性能的代码
数据库的查询优化、索引的优化、存储的优化
数据库数据表设置合适的字段
表数据的拆分
创建高效的索引
增加缓存优化
分布式集群
消息队列的异步
业务架构分层、微服务的结构
Redis集群
30、脏读、幻读、不可重复读
脏读:A事务读取了B事务没有提交的数据
不可重复读:
不可重复读和脏读逻辑类似,主要在事务2在事务1第二次读取时,提交了数据,导致事务前后两次读取的数据不一致
幻读:
事务1第二次查询时,读到了事务2提交的数据
不可重复读与幻读的区别
不可重复读针对的时值的不同,幻读指的是数据条数的不同
31、四种隔离级别
Read uncommitted(读,未提交)
Read committed(读,已提交)
Repetablead(可重复读)
Serializable(序列化又名串行化)
32、数据库的事务 及四大特性
事务:对数据库要么全执行,要么全不执行
原子性:最小的不可分割的,要不全部执行,要不全部不执行。
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性的状态
隔离性:是多个用户并发访问数据库时,数据库为每一个用户开启事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
持久性:数据库信息提交之后,就算数据库奔溃,他的信息保持永久存在
33、为什么不建议mysql中使用UTF-8?
在MYSQL中,”utf8”编码只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。
而真正的utf-8是utf8mb4
34、Varchar与char的区别
Varchar变长 char定长
varchar应用场景:
字符串列的最大长度比平均长度要大很多;
字符串列的更新很少时,因为没有或很少有内存碎片问题;
使用了UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储;
char应用场景:
列的长度为定值时适合适用,比如:MD5密文数据。
35、HTTP协议
http(超文本传输协议)服务器传输超文本本到本地浏览器的传送协议
HTTP是一个基于TCP/IP通信协议来传递
HTTP是一个属于应用层的面向对象协议,由于简捷、快速的方式,适用于分布式超媒体信息系统
主要特点:
简单快速:客户像服务期请求服务时,只需要传送请求方法和路径。请求方法常用的有GET、head、POST,每种方法规定了客户与服务器练习的类型不同。由于HTTP协议简单,使用HTTP服务器的程序规模小,因而通信速度很快。
灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记
无连接、无状态、支持B/S及C/S模式
37、队列和栈
队列(Queue):是限定只能在表的一端进行插入和另一端删除操作的线性表
栈(Stack):是限定之能在表的一端进行插入和删除操作的线性表
队列和栈的规则
队列:先进先出
栈:先进后出
队列和栈的遍历数据速度
队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快
栈:只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,遍历数据时需要微数据开辟临时空间,保持数据在遍历前的一致性
38、nginx和apache区别
Nginx相对于apache的优势
1、轻量级,采用C进行编写,同样的web服务,会占用更少的内存及资源
2、抗病发,nginx以epoll and kequeue作为开发模型,处理请求是异步非阻塞,多个连接对应一个进程,负载能力比apache高很多。
39、依赖注入 控制反转
依赖注入:代码 、从底层到高层进行
控制反转:容器、注入到容器中
40、nginx负载均衡分发策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的应用服务器。如果应服务器down掉,自动剔除,剩下的继续轮询
2、权重
通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况
3、ip_哈希算法
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题。
Nginx的负载均衡与分发策略
通过在upstream函数中添加的应用服务器IP后添加指定参数即可实现
41、nginx和apache区别
Nginx相对于apache的优势
3、轻量级,采用C进行编写,同样的web服务,会占用更少的内存及资源
4、抗病发,nginx以epoll and kequeue作为开发模型,处理请求是异步非阻塞,多个连接对应一个进程,负载能力比apache高很多。
42、排序:
Sort升序
rsort降序 从高到低排序
asrot从低到高排序(保持索引)
ksort按键名从低到高排序 krsort按键名从高到低排序
43、Redis管道:减少请求次数。
44、Swoole
Swoole是php的一个异步、并行、高并发的网络通信引擎
广泛用于互联网、网络游戏、在线直播、聊天室
45、数据库优化查询的方式有哪些
1、调整数据结构的设计:数据进行分库分区
2、调整应用程序结构设计
3、调整数据库SQL语句
4、调整服务器内存分配
46、数据库语句优化的方式有哪些
47、Linux命令
(1) Touch 新增文件
(2) Cat 查看文件最后一屏内容
(3) Chmod 文件权限
(4) Tar -zcvf 打包压缩后的文件名
(5) Top 显示当前系统中占用资源最多的一些进程
(6) Df 显示文件系统的磁盘使用情况
(7) Ps -elf 查看进程信息更详细
48、接口风格理解:code提示状态码 msg提示信息 data数据
传输加密 jwt和接口
49、 SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?
SESSION存储在服务器端:Session比较安全,Session依赖于cookie进行传递
COOKIE保存在客户端:,cookie可以修改,不安全。
禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。
50、http状态码
200 成功
301 永久重定向
302 临时重定向
401 未授权
403 服务器拒绝请求
404 服务器找不到请求的网页
500 服务器内部错误
51、Get和post区别:
Get:在地址栏可以看到 参数拼接在地址上 限制长度 不能大于2KB 获取信息
Post:相对于安全一点 表单提交信息
52、isset() 和 empty() 区别
Isset判断变量是否存在:可以传入多个变量,若其中一个变量不存在则返回假
empty判断变量是否为空为假:只可传一个变量,如果为空为假则返回真。
53、请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。
常见的排序算法: 冒泡排序法、快速排序法、简单选择排序法、堆排序法、直接插入排序法、希尔排序法、合并排序法。
冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就象气泡在水中向上浮一样,所以该算法也称为气泡排序法。
54、请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:php必须赋值
按引用传递的话不需要赋值
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
55、使用PHP描述快速排序算法,对象可以是一个数组?
原理:快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。
56、echo(),print(),print_r()的区别?
Echo,print是PHP语句, print_r是函数,
Print()只能打印出简单类型变量的值(如int,string),有返回值。
print_r()可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串,无返回值
57、什么是模板技术、能够使HTML和PHP分离开使用的模板?
模板技术就是使程序的逻辑代码和界面分开的技术。
能够使HTML和PHP分开的模板有:Smarty、Template、PHPlib Template、FastTemplate
58、数据库索引有几类,分别是什么?什么时候该用索引?
普通索引、主键索引、唯一索引
并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。
59、写几个魔术方法并说明作用?
__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法
__unset()当对一个未定义变量调用unset()时自动调用的方法
__isset()当对一个未定义变量调用isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法
60、你对Memcach的理解,优点有哪些?
Memcache是一种缓存技术,在一定的时间内将动态网页经过解析之后保存到文件,下次访问时动态网页就直接调用这个文件,而不必在重新访问数据库。使用memcache做缓存的好处是:提高网站的访问速度,减轻高并发时服务器的压力。
Memcache的优点:稳定、配置简单、多机分布式存储、速度快。
61、消息队列应用场景
异步处理
应用解耦
流量削锋
日志处理
消息通讯
62、Elasticsarch搜索引擎
63、javascript介绍及应用场景:
Javascript是一个独立的编程语言(轻量级),之前只能运行在浏览器端,近几年谷歌公司推出node.js使得javascript可以运行在服务器端
常用事件:
onClick单击事件
onSelect选中事件
onFocus获得焦点事件
失去焦点onBlur
常用函数:
Alert显示一个警告对话框
Confirm 确认对话框
64、vue和jquery区别:
jQuery是使用选择器($)选取对象,可以进行赋值、取值、绑定事件一些操作
Vue则是通过Vue对象将数据和View完全分离开来了,对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定。这就是传说中的MVVM。
vue应用场景:复杂数据操作的后台页面,表单填写页面
jquery应用场景:比如说一些html5的动画页面,一些需要js来操作页面样式的页面
65、前端框架bookstrap和layui区别
Bookstrap:做前台框架(也可以用于后端) 界面色调简洁,后台系统一般都是表单界面居多
在前端响应式方面做得很好,PC端和移动端表现都不错, 很适合做响应式网站,同时满足PC端和移动端效果,虽然很多公司前端都会有自己的一套框架,但是据我所看的很多大型公司的前端页面的css文件,大凡响应式框架都是借鉴了bootstrap的思想。
Layui:做后台框架 界面色彩鲜艳
封装了很多后台系统常用的效果,很多基于thinkphp的后台系统都会用 layui作为框架,对于后端程序员来说,轻轻松松就可以弄一个很美观的后台界面出来,省事省力,毕竟很多后端程序员对界面ui的掌控是非常有限的。
66、微信小程序应用场景
1、获客渠道多元化
小程序的流量入口众多:公众号关联、朋友之间分享、关键词搜索、附近展现等等。实体店可以借助小程序实现产品的展示、服务预订、产品的售卖等。用户只要通过小程序就可以随时随地享受你提供的服务,用户足不出户体验线上与线下结合购物乐趣。
2、用户走了再来,小程序有一个最大的特点就是用完即走,无需下载。对于实体店来说,既是缺点也是优点。所以可以通过自有的会员系统或者是公众号,利用消息推送功能,进行粉丝和会员的二次开发,增加客户与实体店的粘性,挖掘更多的潜在商业价值。当用户养成了固定的消费习惯,也会为商家带来更多潜在客户。
3、小程序更加高效率的“员工”
对于实体商家来说,小程序是收银员、销售员、推广人员。用户可以通过小程序实现选购、对比、下单、付款等一系列服务。只需要收银员一个月的工资,就可以轻松制作一个符合商家要求的小程序。这样,商家节约出来的人工成本,就可以用来拓展客源。实体运营虽然困难重重,只要顺应时势及完善的营销策略破局是必然的。在这个时代,小程序已然成为实体商家引流的关键一步。
67、微信公众平台应用场景
1、商家向目标客户发送打折优惠信息,提供订餐订座服务。
2、阅读媒体推送每日精选文章,并可以直接与用户交流沟通。
3、休闲娱乐类公众号可以预置关键字,调戏用户与被用户调戏。
4、组织活动,开会。进入会场前,扫一下会议公众号,即可得到会议议程、介绍,并可以与组织者实时交流。
5、电台、电视台与观众互动。
6、名人明星,语音问候粉丝。其他方式与粉丝互动(这一块还有更多模式值得探索,不然会跟微博同质化)
68、Svn和Git区别
1.git是分布式的,svn是集中式的
2.git将每个历史版本都存储完整的文件,svn只是存储差异的文件,历史版本不可恢复
3.git可以离线完成大部分的操作,svn不可以离线操作
4.git可以实现分支合并
5.git可以修改和撤销修改历史版本
6.git速度快,效率高
7.git有本地仓库
8.git以元数据方式存储,svn以原始文件存储
SVN:是集中式版本控制系统
版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git:是分布式版本控制系统
那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
69、什么是Restful
RESTful是一种设计模式
规范应用:
- 模型表示
- 消息
- URIs
- 一致接口
- 无状态
- 资源之间的链接
- 缓存
接口风格理解:code提示状态码 msg提示信息 data数据
传输加密 jwt和接口
REST的核心是资源,并且资源是用统一资源定位符URL来标识的。概念上来讲,资源和他的状态(提供给客户的格式)是分开的。REST不做任何格式上的要求,但 是一般包含XML和JSON。HTTP中的键值对这个题主应该讲的是HTTP报头中的值和属性吧,这个在RESTful中也是可以支持的。
用 PHP 实现 RESTful 风格的 API,最重要的还是:路由的实现、HTTP 请求(request)的解析、HTTP (response)响应的良好封装和JSON 格式的良好支持;采用的PHP框架主要有Phalcon、Laravel、YII 等等
70、thinkphp优点是什么
有助于促进快速应用开发,不仅节省时间,有助于建立更稳定的应用,而且,减少了重复代码的开发。
通常认为PHP框架的作用相当于模型,控制器,视图。(mvc)
①中国人开发,更加符合我们的思维方式,便于上手。
②开源,免费,快捷简单的面向对象轻量级的开发PHP框架。
③支持 Composer,PHPunit(中大型项目必备的依赖管理和测试框架)。
④异常严谨的错误检测和安全机制详细的日志信息为我们的开发保驾护航。
⑤减少了核心依赖,扩展更加灵活方便,支持命令行指令扩展。
⑥支持自动加载的机制。
⑦重构的数据库支持及关联。
71、Redis缓存雪崩:
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力,造成数据库后端故障,从而引起应用服务器雪崩
72、Redis和mysql区别:
他们两个数据库不一样, 一个是非关联数据库 ,一个是关联数据库
Redis做一些缓存 mysql数据化的他是很脆弱的,遇到高并发 并发流量大的话进行一些 死锁或者是锁 一般来说将数据库信息存储在redis当中 他俩区别的话redis可以设置过期时间 mysql一直存储在mysql数据库中
Redis单机并发:需要上线 2万-3万
Redis数据类型:字符串、集合、有序集合、列表、哈希
字符串:用户信息、日志
哈希:也是可以存储用户信息:比如用户名、手机号
有序集合:排行榜
集合:收藏、点赞
项目中接触最多的KBS是:秒杀没有超过redis单击
日销量:
日均PV:十几万
日活量UV:二十几万
工作中对代码、业务进行压测:KBS进行压测
Mysql脏读: A事务未提交B事务读取到A事务未提交的内容
读已提交
73、秒杀
技术层面
1.高访问压力隔离
2.用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀.但是持续刷新商品页面详情页会对服务器造成压力
3.突然增加的网络带宽:主要是很多商品的静态图片如果从某一个服务器去加载,网页必然在秒杀开始的那一刻崩溃
4.如果下单的url可以直接通过html源码获取,那么就会有部分用户绕过网页前端直接在秒杀开始前下单。
5.如何只允许第一个提交的订单被发送到订单子系统
6.限流
7.减库存的时机
8.库存会带来“超卖”的问题
redis分布式乐观锁,如果并发量不算极大也可以考虑zookeeper分布式锁
设计原则
- 尽量将请求拦截在系统上游
- 读多写少的常用多使用缓存
架构
- 前端页面(css, js,图片 )
- 出于性能原因这个一般由js调用客户端本地时间,就有可能出现客户端时钟与服务器时钟不一致,另外服务器之间也是有可能出现时钟不一致
- 站点设计
数据库设计
- 数据库分片
分片解决的是“数据量太大”的问题,也就是通常说的“水平切分”。
一旦引入分片,势必有“数据路由”的概念,哪个数据访问哪个库。
hash分库:
优点:简单,数据均衡,负载均匀
缺点:迁移麻烦(2库扩3库数据要迁移)
- 分组:读写分离
- 读性能
添加索引,主库不加索引,从库加索引
- 数据一致性
**主从一致性:**常用中间件同步主从库,某一个操作会被发送给所有db。
74、负载均衡
负载均衡适用于高访问量的业务,提高应用程序的可用性和可靠性。
应用于高访问量的业务:
如果您的应用访问量很高,您可以通过配置监听规则将流量分发到不同的ECS实例上。此外,您可以使用会话保持功能将同一客户端的请求转发到同一台后端ECS,提高访问效率。
扩展应用程序:
您可以根据业务发展的需要,随时添加和移除ECS实例来扩展应用系统的服务能力,适用于各种Web服务器和App服务器。
消除单点故障:
您可以在负载均衡实例下添加多台ECS实例。当其中一部分ECS实例发生故障后,负载均衡会自动屏蔽故障的ECS实例,将请求分发给正常运行的ECS实例,保证应用系统仍能正常工作。
75、redis缓存机制
数据库缓存:
sql语句时key值,查询结果resultSet是value,当同一个查询语句访问时(select * from t_product),只要曾经查询过,调用缓存直接返回resultSet,节省了数据库读取磁盘数据的时间。
持久层缓存:
减少了连接数据库的时间;减少了resultSet封装成对象的过程。
业务层和控制层的缓存:
减少调用层次。
描述缓存在业务层的逻辑:
查询商品信息
判断当前查询在缓存是否有数据
如果有数据,直接返回,当前请求结束;
如果没有数据,查询持久层数据库数据,获取数据存储再缓存一份,供后续访问使用;
76、缓存雪崩/缓存击穿
海量请求访问服务器,服务器的性能由缓存支撑,一旦一定范围的缓存数据未命中,请求的数据访问涌入数据库;承受不了压力造成宕机–重启–海量请求并未消失–宕机–重启,系统长时间不可用;这种情况就是缓存的雪崩。
77、接口和抽象的区别
1) 都是上层的抽象层。
2) 都不能被实例化
3) 都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不比提供具体的实现。
他们的区别如下:
1) 在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。
2) 一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。
78、数据库设计三范式
第一范式:用来确保每列的原子性,确保每列或者每个属性值都是不可拆分的最小单元
第二范式:要求表中的每列都和主键相关,即要求实体的唯一性
79、第三范式XSS攻击,如何防止?
XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特殊的模式去执行攻击者构造的脚本,然后利用不安的Activex控件执行恶意的行为。
80、接口安全
Token授权机制:用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserID以键值对的形式存放在缓存服务器中。服务端接收请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭证。
时间戳超时机制:用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间,则认为该请求失效,时间戳超时机制是防御DOS攻击的有效手段。
签名机制:将Token和时间戳加上其他请求参数在同MD5或SHA-1算法加密加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改
81、Laravel生命周期
1、Laravel 采用了单一入口模式,应用的所有请求入口都是public/index.php文件
2、注册类文件自动加载器:Laravel通过composer进行依赖管理,无需开发者手动导入各种类文件,而是有自动加载器自动导入
3、创建服务器容器:从bootstrap/app.php文件中取得Laravel应用实例$app(服务容器)
4、进入Http/console内核:创建HTTP/console内核,传入的请求会被发送欸HTTP内核或者console内核进行处理
5、加载服务器提供的容器:在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用,服务器提供者负责引导启动框架的全部各种组件
6、分配请求:一旦应用完成引导和所有服务提供者都注册完成,Request将会移交给路由进行分发。路由将分发请求给一个路由或控制器,同时运行路由指定的中间件。
82、Laravel依赖注入、容器
laravel容器负责存放所需要的各种类,当需要的时候再从容器中解析。
依赖注入这个花哨名词实质上是指:类的依赖通过构造函数,或者某些情况下通过“setter”方法“注入”到类中。
Laravel的核心就是其loc服务容器。
83、Redis管道 好处是什么
Redis是一个TCP服务器,支持请求/响应协议。 在Redis中,请求通过以下步骤完成:
客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应。
服务器处理命令并将响应发送回客户端。
管道的意义
管道的基本含义是,客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复。
管道的好处
这种技术的好处是大大提高了协议性能。通过管道从连接到本地主机速度增加五倍,因特网连接的至少快一百倍
如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依次执行,并返回结果,为了解决此类问题,设计者设计出了redis管道命令:客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复,从而大大增加了协议性能
84、数据库的隔离级别?优点
1、读未提交((Read uncommitted):这种事务隔离级别下,select语句不加锁。此时,可能读取到不一致的数据,即“读脏”。这是并发最高,一致性最差的隔离级别
2、读已提交(Read committed):可避免脏读的发生。在互联网大数据量,高并发的场景下,几乎不会使用
3、可重复读(Repeatable read):Mysql默认的隔离级别,可避免脏读、不可重复读的发生
4、串行化(Serializable):可避免脏读、不可重复读、幻读的发生。
85、XSS、CSRF
XSS:跨站脚本攻击,恶意攻击者往web页面里插入恶意script代码,当用户浏览该页面时,嵌入其中web里面script代码会被执行,从而达到恶意攻击用户的目的
防御:用户输入的过滤,对用户提交内容进行可靠的输入验证。
输入转义
CSRF:跨站请求伪造,不攻击服务器而攻击正常访问网站的用户。 冒充用户在站内正常操作
防御:验证HTTP Referer字段,利用HTTP头中的Referer判断请求来源是否合法,Referer记录了该HTTP请求的来源地址。
Token 在请求地址中添加tiken并验证
86、什么是索引
给书建立一个目录、并不是越多越好
87、MYSQL背后的数据结构
B+树数据结构
88、什么是缓存穿透
如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。
造成缓存穿透的主要原因就是:查询某个Key对应的数据,Redis缓存中没有相应的数据,则直接到数据库中查询。数据库中也不存在要查询的数据,则数据库会返回空,而Redis也不会缓存这个空结果。这就造成每次通过这样的Key去查询数据都会直接到数据库中查询,Redis不会缓存空结果。这就造成了缓存穿透的问题
89、什么是缓存击穿
如果缓存中的数据在某个时刻批量过期,导致大部分用户的请求都会直接落在数据库上,这种现象就叫作缓存击穿。
造成缓存击穿的主要原因就是:我们为缓存中的数据设置了过期时间。如果在某个时刻从数据库获取了大量的数据,并设置了相同的过期时间,这些缓存的数据就会在同一时刻失效,造成缓存击穿问题。
90、TCP和UDP的区别
(8) 连接差异
TCP是面向连接的
UDP是无连接的,也就是说,在发送数据之前不需要建立连接
(9) TCP提供可靠的服务。通过TCP连接传输的数据是无错误的,无丢失,无重复,并按顺序到达
UDP尽最大努力提供,即不保证可靠的提供
(10) TCP的传输效率相对较低
UDP传输效率高适合高速传输和实时通信或广播通信。
(11) TCP连接只能是点对点、一对一。
UDP支持一对一、一对多、多对一和多对多交互通信
1. 首先,TCP是面向连接的,UDP不需要连接,TCP有三个握手和四个波,三个握手和四个波是TCP建立连接的两个重要步骤,TCP是IP不可靠的来源,UDP继承了IP的特性,不保证不丢失数据包,不保证按顺序到达;
2。TCP是面向字节流的,发送时它是一个流,没有头和尾。IP包不是一个流,而是一个接一个的IP包,UDP也是;
3。TCP有拥塞控制,但UDP没有。
4. 基于连接和无连接;
5。对系统资源的要求(更多的TCP,更少的UDP);
6。UDP程序结构比较简单;
7。流模式和数据报模式;
8。TCP保证数据的正确性,UDP可能会丢失数据包;
9。TCP保证数据顺序,但UDP不保证。
91、唯一索引和普通索引
普通索引:唯一任务就是加快对数据的访问速度,因此,应该只为那些最经常出现在查询条件或者排序条件中数据列创建索引。
92、php单例模式“三私一公”
三私一公:
私有化静态属性
私有化构造方法
私有化克隆方法
公有化静态方法
需要一个保存类的唯一实例的私有静态成员变量
构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义
克隆函数必须声明为私有的,防止对象被克隆
必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。
93、回表
InnoDB 通过索引查到对应的这条数据的记录
避免回表
把要查询的字段放入索引
回表:举个例子,就是我们这边有一个用户表,用户登录时,查询用户信息时我们都会根据username去查询,所以我们会给username加一个唯一索引,这时就出现回表了,因为Mysql使用的是INNODB的聚簇索引,数据都和主键索引放在一起,而其他索引只存了主键,所以会先根据username查询一下表中的主键,再根据表中的主键查询password,这就产生了回表。
预防回表:我们可以使用组合索引,将username和password两个索引放在一起,将username放在前面查询就可以了。
94、进程、线程和协程之间的区别和联系
保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆
通信IPC:管道、消息队列
调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;
并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;
拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等;
系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
95、乐观锁与悲观锁
悲观锁:次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁
两钟锁的使用场景:
像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。
96、get和post区别:
Get在地址栏可以看到 参数拼接在地址上 限制长度 不能大于2KB 获取信息
Post:相对于安全一点 表单提交信息
97、tp开启事务的语句
开始事务 start_transaction
提交事务 commit
回滚事务 rollback
启动事务两种方式:
Begin
Start transaction
98、为什么使用消息队列?
使用MQ有很多好处,比较核心的有三个:
解耦、异步、削峰。
99、消息队列有哪些使用场景?
解耦场景说明:
订单系统发送数据到库存系统、积分系统、支付系统三个系统,通过接口调用发送。削峰场景说明:
抢购系统每天 0:00 到 14:00风平浪静,每秒并发请求数量就50~60个。结果每次一到14:00~15:00,每秒并发请求数量突然会暴增到6K+条。但是系统是直接基于MySQL的,大量的请求涌入MySQL,每秒钟对MySQL执行约6k条SQL。一般的MySQL,扛到每秒2k个请求就差不多了,如果每秒请求到6k的话,可能就直接把 MySQL给搞挂掉导致系统崩溃,用户也就没法再使用系统了。但是高峰期一过,到了下午的时候,就成了低峰期,可能也就1w的用户同时在网站上操作,每秒中的请求数量可能也就60个请求,对整个系统几乎没有任何的压力。
100、微信支付流程:
从前端到后端支付id,返回给前端,前端调用微信支付 返回回调方法
第三方插件:Yansongda
101、支付宝功能如何实现:
前台提交订单数据给后台,后台形成订单,产生支付连接回调接口,然后发送给前台
102、怎么判断用户是否是登录状态?
Token三个小时失效 改token 安全(把id加密)
103、签名
验证数据 防止篡改 前端调用后端 通过md5加密生成sign签名 &拼接 foreach循环
104、Token认识:
l 接口:是一种方法,给前端调用 接口是凭证、token认证签名(演唱会)
l 调接口需要凭证 进行签名认证
l token是加密密文,自己定义一种规则解密验证,存在哪里不重要
105、Require和include区别:
报错级别不同
Require:报错后,不会继续向下执行
Include:报错后,继续向下执行
106、isset() 和 empty() 区别
Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真
107、说说你对缓存技术的了解?
1、缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。
2、使用memcache可以做缓存。
108、面向对象:
多态:多种方式得一种形态 (动物园:猪、猴子…)
封装:封装方法
继承:封装方法,子类调用
109、PHP字符串中单引号与双引号的区别?
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
110、什么是时间戳? 如何取得当前时间戳?
时间戳是从1970年1月1日 00:00:00到指定日期的秒数。
获取当前时间戳:time()
111、ThinkPHP中M方法与D方法有什么区别
ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类。
D方法:不支持跨项目调用,需要使用
M方法:关联模型业务逻辑比较复杂
112、解决跨域问题
什么是跨域?
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域
解决跨域问题:
- Jsonp 填充式json
- Niinx反向处理
- Php修改为header
113、 反向代理:用户与服务器之间
114、定时任务 Linux命令:crontab
115、Error_reporting:设置php报错级别
116、什么是CSRF攻击?XSS攻击?如何防范?
CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的方式来防范。
XSS:跨站脚本攻击, 转义、过滤(前端传来的参数)来防范,还有CSP
117、 端口号:
Nginx:80 redis:6379 mysql:3306
Apache:80 SSL:443