PHP后端面试85问

1.(int)'0xff'为什么是0?
0xff是字符串 字符串转int 第一个是0 可以转换成功 xff转换失败
2. PHP中10进制与16进制互转

#10转16 dechex(52558); 或 gmp_strval(52558,16); #16转10 hexdec('0xcd4e');

3. 通过aux命令查询cup和内存前十的记录
ps -aux --sort -pcpu,-pmem | head -n 10 pcpu是CPU利用率 pmem是内存利用率 --sort -是降序,+是升序

4. 面向对象基本原则?
  1. 单一职责原则SRP(Single Responsibility Principle) :是指一个类的功能要单一,不能包罗万象。
  2. 开放封闭原则OCP(Open-Close Principle) 一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
  3. 替换原则(the Liskov Substitution Principle LSP) :子类应当可以替换父类并出现在父类能够出现的任何地方。
  4. 依赖倒置原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。
  5. 接口分离原则(the Interface Segregation Principle ISP) 模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。
5. 设计模式分类,设计原则
创建型模式、结构型模式、行为模式
参考:https://github.com/jiayisheji...
  • 创建型模式,就是创建对象的模式,抽象了实例化的过程。
    • 简单工厂模式(Simple Factory)
    • 工厂方法模式(Factory Method)
    • 抽象工厂模式(Abstract Factory)
    • 创建者模式(Builder)
    • 原型模式(Prototype):利用原型实例来“克隆”创建新的对象。
    • 单例模式(Singleton)
  • 结构型模式:处理类或对象间的组合。是为解决怎样组装现有的类,设计它们的交互方式,从而达到实现一定的功能目的。
    • 外观模式/门面模式(Facade门面模式)
    • 适配器模式(Adapter)
    • 代理模式(Proxy)
    • 装饰模式(Decorator)
    • 桥接模式(Bridge)
    • 组合模式(Composite):
    • 享元模式(Flyweight)
  • 行为型模式涉及到算法和对象间职责的分配,行为模式描述了对象和类的模式,以及它们之间的通信模式。
    • 模板方法模式(Template Method)
    • 观察者模式(Observer)
    • 状态模式(State)
    • 策略模式(Strategy)
    • 职责链模式(Chain of Responsibility)
    • 命令模式(Command)
    • 访问者模式(Visitor)
    • 调停者模式(Mediator)
    • 备忘录模式(Memento)
    • 迭代器模式(Iterator)
    • 解释器模式(Interpreter)
6. PHP一次web请求的流程
  1. 浏览器发送URL请求
  2. DNS解析域名
  3. 获取到IP后开始访问IP和Port
  4. 开发发送TCP请求到Nginx
  5. Nginx解析server name ,然后发送到 php-fpm管理进程
  6. php-fpm把具体的请求交给PHP执行
7. PHP静态变量有几种?
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元)。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量的值可变,但不会随着函数的调用和退出而发生变化。
静态局部变量:static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
静态变量的初始值为0。
静态全局变量:全局变量(外部变量)的声明之前再冠以static 就构成了静态的全局变量。
7.局部变量和静态局部变量,全局变量和静态全局变量的区别?
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域(静态全局变量只在定义该变量的源文件内有效),限制了它的使用范围。
php之static静态变量详解
9.array_merge和array+array的区别?
$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; echo json_encode($a); //[0,1,2,3,5]

array_merge()不会覆盖掉原来的值
array+array合并数组则会把最先出现的值作为最终结果返回,抛弃掉后面的数组拥有相同键名的值。
10.foreach引用传值结果

参考:https://www.php.net/manual/zh...
11.PHP的执行过程?
  1. 扫描(scanning) :将index.php内容变成一个个语言片段(token)
  2. 解析(parsing) :将一个个语言片段变成有意义的表达式
  3. 编译(complication):将表达式编译成中间码(opcode)
  4. 执行(execution):将中间码一条一条的执行
  5. 输出(output buffer):将要输出的内容输出到缓冲区
12.PHP的变量存储
php中变量存在于zval变量容器中。
zval结构:变量类型,变量值,is_ref字段,refcount字段。
  • is_ref:是个bool值,用来区分变量是否属于引用集合,表示变量是否有一个以上的别名。
  • refcount:计数器,表示指向这个zval变量容器的变量个数。
  • 当refcount值为1时,is_ref的值为false。因为refcount为1,此变量不可能有多个别名,也就不存在引用了。
  • 将一个变量 = 赋值给另一个变量时,不会立即为新变量分配内存空间,而是在原变量的zval中给refcount加1。
  • 有当原变量或者发生改变时,才会为新变量分配内存空间,同时原变量的refcount减 1 。
  • 如果unset原变量,新变量直接就使用原变量的zval而不是重新分配。
  • &引用赋值时,原变量的is_ref 变为1,refcount 加1. 如果给一个变量&赋值,之前 = 赋值的变量会分配空间。
13.PHP环状引用内存泄漏

PHP5.2以前,refcount为0,则变量的空间可以被释放,否则就不释放
unset($a); //refcount减1变为1,不会回收

14.PHP5.3的GC垃圾回收机制
算法把所有可能根(possible roots 都是zval变量容器),放在根缓冲区(root buffer)中(称为疑似垃圾),在根缓冲区满了时,对缓冲区内部所有不同的变量容器执行垃圾回收操作。
或者我们在脚本中使用gc_collect_cycles,强制回收缓冲区中的垃圾。
  1. 如果一个引用计数refcount增加,它将继续被使用,当然就不再在垃圾中。
  2. 如果引用计数refcount减少到0,所在变量容器将被清除(free),不会进入缓冲区。
  3. 仅仅在引用计数减少到非零值时,才会产生垃圾周期(garbage cycle),将其放入缓冲区。在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。
或者我们在脚本中使用gc_collect_cycles()强制回收缓冲区中的垃圾。
15. PHP开启/关闭垃圾回收
默认的,PHP的垃圾回收机制是打开的,然后有个 php.ini 设置允许你修改它:zend.enable_gc
在程序中使用gc_enable() 和 gc_disable()开启和关闭
16. XSS攻击及防御机制
Xss(cross-site scripting)跨站脚本攻击:指攻击者往Web页面里插入恶意html标签或javascript代码。
防御机制:
  • 转义标签(htmlspecialchars)
  • 限制字符(reg\_match)
  • 过滤(preg\_replace)
  • cookie设置HTTPOnly(js无法读取)
  • 模板引擎
17.CSRF攻击及防御机制
【PHP后端面试85问】CSRF跨站点请求伪造(Cross—Site Request Forgery):
CSRF攻击攻击原理及过程如下:
  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
  2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
  3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
防御CSRF攻击:目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。
18. 有一个文件ip.txt,每行一条ip记录共若干行,如何统计出现次数最多的前3个ip及其次数?
sort -nr ip.txt | uniq -c | sort -nr | head -n 3uniq -c filename用于去除冗余并统计每一行出现的次数。 sort -r 指逆序排序 -n指按数字字符串大小排序 head -n 指定数量

注:第一次排序,把ip按顺序排列,因为第二个uniq只会合并相邻项 第二次排序,才是把ip按出现次序大小从大到小排列 最后取前三项结果。
19. Mysql B-Tree和B+Tree的结构?
B-Tree:
  1. d>=2,即B-Tree的度(对于一个节点,有n个边和它相连,就叫做数=n);
  2. h为B-Tree的高;
  3. 每个非叶子结点由n-1个key和n个指针组成,其中d<=n<=2d;
  4. 每个叶子结点至少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶结点的指针均为NULL;
  5. 所有叶结点都在同一层,深度等于树高h;
  6. key和指针相互间隔,结点两端是指针;
  7. 一个结点中的key从左至右递增排列;
  8. 一个度为dB-Tree,设其索引Nkey,则其树高h的上限为logd((N+1)/2),检索一个key,其查找结点个数的渐进复杂度为O(logdN)
B+Tree:
  • 每个结点的指针上限为2d而不是2d+1(指针个数和 key的个数相同)。
  • 非叶子结点不存储data,只存储key
  • 叶子结点不存储指针。
20.正则表达式引擎
NFA,表达式主导引擎
DFA,文本主导引擎
DFA引擎搜索更快一些。但是NFA以表达式为主导,更容易操纵,因此一般程序员更偏爱NFA引擎
21. GET和POST的区别
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。
  • GET产生一个TCP数据包,POST产生两个TCP数据包。
参考:https://blog.csdn.net/happy_x...
22. Mysql优化器的参考标准
mysql对索引的是用是由mysql的server层的优化器决定的
23.Memcache和Redis单个key大小限制
Memcache单个key(变量)存放的数据有1M的限制
Redis单个key(变量)存放的数据有1G的限制
24.缓存雪崩的处理办法
事前:进行系统压力测试,在负载均衡层做限流处理,过载丢弃请求或者进入队列
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地缓存 + 限流降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
25.分布式id算法? 雪花算法是 twitter 开源的分布式 id 生成算法,采用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。
PHP后端面试85问
文章图片

1 bit:不用,为啥呢?因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2^41 - 1 个毫秒值,换算成年就是表示69年的时间。
10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10台机器上哪,也就是1024台机器。但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2^5个机房(32个机房),每个机房里可以代表 2^5 个机器(32台机器)。
12 bit:这个是用来记录同一个毫秒内产生的不同 id,12 bit 可以代表的最大正整数是 2^12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。
26.Redis内存淘汰机制
  • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
27. 常见MQ选型
ActiveMQ 基于 Java 开发的, RabbitMQ 是基于 erlang 开发的。
特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级,比 RocketMQ、Kafka 低一个数量级 同 ActiveMQ 10 万级,支撑高吞吐 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic 数量对吞吐量的影响 topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性 ms 级 微秒级,这是 RabbitMQ 的一大特点,延迟最低 ms 级 延迟在 ms 级以内
可用性 高,基于主从架构实现高可用 同 ActiveMQ 非常高,分布式架构 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性 有较低的概率丢失数据 基本不丢 经过参数优化配置,可以做到 0 丢失 同 RocketMQ
功能支持 MQ 领域的功能极其完备 基于 erlang 开发,并发能力很强,性能极好,延时很低 MQ 功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用
28. 树数据结构分类
有序树的定义:若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(Ordered Tree)
无序树的定义:若将树中每个结点的各子树从左到右是没有次序的(即可以互换),则称该树为无序树
29. 数据,数据元素,数据项,数据对象的详细理解
1.数据(Data):数据就是用户输入到计算机被计算机程序处理的一些符号,比如图片还有声音等....
2.数据元素(Data Element):是数据的基本单位,数据元素用于完整的描述一个对象,比如一个学生表,学生表也是由 数据元素和数据项组成的.
3.数据项(Data ltem):是组成数据元素的!例如 学生表 的中的 "学号 姓名 性别"等数据项.
4.数据对象:是性质相同的数据元素的集合,是数据的一个子集,例如:整数数据对象的集合 N={1,2,3,4,5,6,7,...};
30. 301和302跳转的区别?PHP如何显示301,302,403,404跳转?
301 Moved Permanently 永久重定向
302 Moved Temporarily 临时重定向(POST改为GET)
307 Temporary Redirect 临时重定向(保持POST)
301一般用作永久跳转,除非用户清浏览器缓存,否则不会修改跳转地址;
302和307可以在后端修改跳转地址,不同在于302会把POST转为GET请求,307可以保持POST
//301跳转 header("HTTP/1.1 301 Moved Permanently"); Header("Location: http://www.baidu.com"); //302 Header("Location: http://www.baidu.com"); //403 header('HTTP/1.0 403 Forbidden'); //404 header('HTTP/1.1 404 Not Found'); header("status: 404 Not Found");

31. 复合索引的使用条件?
复合索引只有在前面的字段为精确查询时,才会用上后面的复合索引,一旦出现不精确查询,则不会使用复合索引。
select * from test where a=10 and b>10 order by c

使用了a_b索引,order by c不使用索引
32. sql语句从执行到返回结果中间花费时间最长的环节是哪步
查询结果的数据量越大返回时间越长,远远超过其他环节的占用时间。
33.PHP模式修饰符
模式修饰符 含义
i 正则表达式匹配时不区分大小写
m 不加m时,被匹配的字符串被当成整体一行处理,^匹配开始位置,$匹配结束位置或匹配最后一个换行符;
加m时,被匹配的字符串通过换行符当成多行处理,每行都与^和$包围的正则进行匹配
s 正则表达式中的点号(.)将表示任何字符,包括换行符
x 正则表达式中除转义外的空字符,其它空字符将被忽略
e 只用在正则替换的函数比如preg_replace()中,表示用一个函数替换内容。该修饰符在高版本php中已不再使用,已被preg_replace_callback()所替代
A 匹配时会从字符串开始位置进行匹配
D 不加D时,$匹配结束位置或匹配最后一个换行符;
加D时,仅匹配结束位置;
如果设定了修饰符m则会忽略修饰符D
U 不加U时,是贪婪匹配,会最大量的找匹配部分;
加U时,是非贪婪匹配,只找最小的匹配部分
34. HTTP常用方法及作用
  • 一台服务器要与HTTP1.1兼容,只要为资源实现GET和HEAD方法即可
  • GET是最常用的方法,通常用于请求服务器发送某个资源。
  • HEAD与GET类似,但服务器在响应中值返回首部,不返回实体的主体部分
  • PUT让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者,如果那个URL已经存在的话,就用干这个主体替代它
  • POST起初是用来向服务器输入数据的。实际上,通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到要去的地方。
  • TRACE会在目的服务器端发起一个环回诊断,最后一站的服务器会弹回一个TRACE响应并在响应主体中携带它收到的原始请求报文。TRACE方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链。
  • OPTIONS方法请求web服务器告知其支持的各种功能。可以查询服务器支持哪些方法或者对某些特殊资源支持哪些方法。
  • DELETE请求服务器删除请求URL指定的资源
35. 常见header请求头
- - 示例
vary 告诉代理服务器/缓存/CDN,如何判断请求是否一样 Vary: Accept-Encoding,User-Agent
Rang 请求一段内存,如0到2000字节,可用于断点下载 Rang bytes=0-2000
Referer 来源地址
Upgrade 切换协议版本 Upgrade: HTTP/2.0, SHTTP/1.3
User-Agent 用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
X-Requested-With null 传统请求;XMLHttpRequest Ajax请求
参考:https://www.cnblogs.com/yunlo...
36.外部排序使用的数据结构
外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。
外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装人内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。 大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下,那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。 这样我们就提出了一个新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构,也就是B-tree(B树结构)
37. PHP三大模块
内核、zend引擎、以及扩展层
参考:[PHP内核]()
38.opcode是什么?
opcode 是Php脚本编译后的中间码,Zend引擎将源文件转换成opcode代码,然后在虚拟机上运行
缓存opcode 后 可以加快网站的运行速度
用apc 或者xcache 缓存可以缓存php的opcode
39.字母如何转二进制?
A的ASCII码是65,16进制对应41,二进制对应01000001
a的ASCII码是97,16进制对应61,二进制对应01100001
40. Apache和Nginx的区别?
  • Nginx是轻量级,比apache占用更少的内存以及资源
  • apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
41.PHP的魔术方法,魔术常量,超全局变量
魔术方法
__construct __destruct __call __callStatic __get __set __isset __clone __unset __sleep __wakeup __toString __invoke //反射:当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。 __set_state

魔术常量:所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化。
__LINE__ 获取文件中的当前行号。 __FILE__ 获取文件的完整路径和文件名。 __DIR__获取文件所在目录。 __FUNCTION__ 获取函数名称(PHP 4.3.0 新加)。 __CLASS__获取类的名称(PHP 4.3.0 新加)。 __METHOD__ 获取类的方法名(PHP 5.0.0 新加)。 __NAMESPACE__ 当前命名空间的名称(区分大小写)。 __TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 *Foo\Bar*)。

超全局变量(9个)
$GLOBALS :储存全局作用域中的变量 $_SERVER :获取服务器相关信息 $_REQUEST :获取POST和GET请求的参数 $_POST : 获取表单的POST请求参数 $_GET : 获取表单的GET请求参数 $_FILES :获取上传文件的的变 $_ENV : 获取服务器端环境变量的数组 $_COOKIE:获取浏览器的cookie $_SESSION : 获取session

42.Linux新用户配置文件的目录
/etc/skel/目录是用来存放新用户配置文件的目录,当我们添加新用户的时候,这个目录下的所有文件会自动被复制到新添加的用户的家目录下。 这个目录下的所有文件都是隐藏文件(以.点开头的文件)。
43. 国标码,区位码,机内码,机器码的区别?
【国标码】指国家标准汉字编码:GB-2312
【区位码】区位码在GB-2312中预留了一些空位,便于补充和扩展
【机内码】汉字ASCII码。指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。
【机器码】计算机直接使用的程序语言,其语句就是机器指令码。
44. PHP文件指针操作?
ftell(resource handle)//返回文件指针的当前位置 fseek(resource hanlde,int offset[,int whence])//移动文件指针到指定位置 rewind(resource handle)//移动文件指针到文件的开头 feof() //测试文件指针是否在结尾

45. 简述HTTP和TCP/IP协议
  1. HTTP超文本传输协议,是应用层协议,主要解决如何包装数据,是基于TCP连接的。TCP/IP 传输控制协议是传输层协议,主要解决数据在网路中如何传输的问题。
  2. HTTP协议是获取地址,传递数据的一种基于请求与响应模式的应用层的协议。而TCP是服务器和客户端可以互相发送消息的交互模式。服务器主动可以推送消息给客户端。
  3. Http就是在每次请求完成后就把TCP连接关了,所以是短连接。TCP是长连接。
46. HTTP报文的组成
Http报文包括请求报文和响应报文两大部分:
  • 请求报文:
    • 请求行(request line):请求类型、访问的资源,HTTP版本
    • 请求头(header):通知服务器有关于客户端请求的信息
    • 空行:表示请求头已经结束
    • 请求体:可以承载多个请求参数的数据
  • 响应报文:
    • 状态行
    • 响应头部
    • 空行
    • 响应体
参考:https://www.cnblogs.com/xingx...
47. HTTP1.1的优点
  1. 支持长连接:默认Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的TCP连接。
  2. 在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟即减少了 TCP 慢启动次数
  3. 允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,减少了 RTTs 数量以及下载过程所需要的时间
  4. 提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
  5. 安全性能并不是HTTP1.1的特点,不过使用HTTPS解决了HTTP的安全问题,即安全的超文本传输协议(SHTTP).
48.PHP中以mb_开头的方法和非mb开头的方法区别?
以mb开头的字符串函数,处理的字符串可以是多字节的
如strlen函数,UTF8中文是3个字节长度,mb_strlen是1个字节长度
49.str_replace与substr_replace的区别
str_replace() :函数替换字符串中的一些字符(区分大小写)
substr_replace():指定位置把字符串的一部分替换为另一个字符串

50.简述TCP和UDP协议
TCP:传输控制协议
UDP:用户数据报协议
1、udp是无连接的,tcp是面向连接的;
2、udp是不可靠传输,tcp是可靠传输;
3、udp是面向报文传输,tcp是面向字节流传输。
PHP后端面试85问
文章图片

tcp和udp有什么区别
51.TCP RTTs:加权平均往返时间
TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT。
超时重传时间RTO
RTTD是RTT的偏差的加权平均值
52.awk用法
上古神器AWK
53.inode
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
inode包含文件的元信息,具体来说有以下内容:
  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个inode
  • 文件数据block的位置
除了文件名以外的所有文件信息,都存在inode之中
可以用stat命令,查看某个文件的inode信息:
stat example.txt
54.file()和file_get_contents()的区别
file() 函数把整个文件读入一个数组中。数组中的每个单元都是文件中相应的一行,包括换行符在内。失败返回 false。
file_get_contents() 函数把整个文件读入一个字符串中。失败返回 false。
55.PHP的单例模式应用场景
单次页面级请求,出现多个应用场景并需要共享同一对象资源时。
比如数据库操作类、网络请求类、日志操作类、配置管理服务等等。
class Singleton { private static $uniqueInstance; private $singletonData = 'https://www.it610.com/article/单例类内部数据'; private function __construct() { // 构造方法私有化,外部不能直接实例化这个类 } public static function GetInstance() { if (self::$uniqueInstance == null) { self::$uniqueInstance = new Singleton(); } return self::$uniqueInstance; } public function SingletonOperation(){ $this->singletonData = 'https://www.it610.com/article/修改单例类内部数据'; } public function GetSigletonData() { return $this->singletonData; } }

一起聊聊PHP中的单例模式
56.PHP的socket
Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。
  • 客户端过程:创建 Socket,连接服务器,将 Socket 与远程主机连接(注意:只有 TCP 才有“连接”的概念,一些 Socket 比如 UDP、ICMP 和 ARP 没有“连接”的概念),发送数据,读取响应数据,直到数据交换完毕,关闭连接,结束 TCP 对话。
  • 服务端过程:先初始化 Socket,建立流式套接字,与本机地址及端口进行绑定,然后通知 TCP,准备好接收连接,调用 accept() 阻塞,等待来自客户端的连接。如果这时客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕。最后关闭连接,交互结束。
php中socket是什么?
57.PHP数组结构及排序原理
PHP数组是由哈希表 + 双向链表实现
排序原理:
  1. 申请n个额外空间
  2. 遍历双链表 调用排序函数zend\_qsort(内部是快速排序算法)对数组排序
  3. 调用排序函数zend\_qsort(内部是快速排序算法)对数组排序
  4. 排序后,双链表中节点的位置发生变化,因而调整指定指向
  5. 遍历数组,分别设置每一个节点的pListLast和pListNext
  6. 设置HashTable的pListTail
58.PHP语言结构和函数
  • 语言结构:就是PHP语言的关键词,语言语法的一部分
  • 函数:由代码块组成的,可以复用。函数都要先被PHP解析器(Zend引擎)分解成语言结构,多了一层解析器解析。
语言结构列表 :
echo() print() die() isset() unset() include() array() list() empty() require(),注意,include_once()是函数 ,require_once()是函数
59.PHP-FPM的运行方式及优缺点?
  • static :表示在 php-fpm 运行时直接 fork 出 pm.max_chindren 个子进程,
  • dynamic:表示,运行时 fork 出 start_servers 个进程,随着负载的情况,动态的调整,最多不超过 max_children 个进程。
一般推荐用 static ,优点是不用动态的判断负载情况,提升性能;缺点是多占用些系统内存资源。
N 是 CPU 内核数量,M 是 PHP 能利用的内存数量,m 是每个 PHP 进程平均使用的内存数量
dynamic 方式的公式: 在 N + 20% 和 M / m 之间
static方式的公式:M / (m 1.2)
pm.max_requests:指的是每个子进程在处理了多少个请求数量之后就重启。这个参数,理论上可以随便设置,但是为了预防内存泄漏的风险,还是设置一个合理的数比较好。
60.PHP常用信息函数
phpinfo — 输出关于 PHP 配置的信息 phpversion — 获取当前的PHP版本 php_sapi_name — 返回 web 服务器和 PHP 之间的接口类型 ini_get — 获取一个配置选项的值 ini_get_all — 获取所有配置选项 ini_restore — 恢复配置选项的值 ini_set — 为一个配置选项设置值

61.Shell基本操作
变量赋值:变量名=值如 FRUIT=apple 取变量值:在变量名前加上 $,这在shell中一般是取变量值的意思 算术表达式求值:$(( ... ))如echo $((a + b)) 字符串比较: -n 是否不为空 -z 是否为空如 if [ -n "$str1" ]

62.算法,逻辑结构,存储结构的关系
一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。
  • 顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构(关系)。
  • 链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针(pointer ),用该指针来表示数据元素之间的逻辑结构(关系)
63.PHP伪类型
伪类型:假类型,实际上在PHP中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习。
  1. mixed混合类型:多种PHP中的数据类型
  2. number数字类型:任意数值类型(整形和浮点型)
  3. callback回调类型:回调函数作为参数
64.正则匹配符
PHP后端面试85问
文章图片

PHP后端面试85问
文章图片

65.TCP/IP协议中ARP及RARP协议的作用?
ARP协议的作用是由IP地址查找对应的MAC地址
RARP协议的作用正好相反,是由MAC地址查找对应的IP地址。
66. 重放攻击,Smurf攻击,字典攻击,中间人攻击
  • 重放攻击指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的地方进行。
  • Smurf攻击是一种分布式拒绝服务 (DDoS) 攻击,结合使用IP欺骗和ICMP回复方法使大量网络传输充斥目标系统,引起目标系统拒绝为正常系统进行服务。Smurf攻击通过使用将回复地址设置成网络的广播地址的ICMP应答请求数据包,来淹没受害主机,最终导致该网络的所有主机都对此ICMP应答请求做出回复,导致网络阻塞。更复杂的将源地址改为第三方的受害者,最终导致第三方崩溃。
  • 字典攻击是在破解密码或密钥时,逐一尝试用户自定义词典中的可能密码的攻击方式。与暴力破解的区别是,暴力破解会逐一尝试所有可能的组合密码,而字典攻击会使用一个预先定义好的单词列表。
  • 中间人攻击是一种间接的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机称为“中间人”。通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信的双方毫不知情。
71.EXT3,EXT4,XFS文件系统大小?
Linux 文件系统大小 单个文件大小
ext3 16TB 2TB
ext4 1EB 16TB
xfs 18EB 9EB
72.Linux 系统文件描述符:
0:STDIN 标准输入
1:STDOUT 标准输出
2:STDERR 标准错误输出
73.Mysql日志
  1. 有多少种日志 redo/undo
  2. 日志的存放形式
    1. redo:在页修改的时候,先写到redo log buffer 里面,然后写到redo log 的文件系统缓存里面(fwrite),然后再同步到磁盘文件(fsync)。
    2. Undo:在MySQL5.5之前,undo只能存放在ibdata*文件里面,5.6之后,可以通过设置innodb\_undo\_tablespaces参数把undo log存放在ibdata*之外。
  3. 事务是如何通过日志来实现的: 因为事务在修改页时,要先记undo,在记undo之前要记undo的redo,然后修改数据页,再记数据页修改的redo。Redo(里面包括undo的修改)一定要比数据页先持久化到磁盘。当事务需要回滚时,因为有undo,可以把数据页回滚到前镜像的状态,崩溃恢复时,如果redo log中事务没有对应的commit记录,那么需要用undo把该事务的修改回滚到事务开始之前。如果有commit记录,就用redo前滚到该事务完成时并提交掉。
74. Mysql json类型
5.7.8开始,mysql开始支持json数据类型,json数据类型存储时会做格式检验,不满足json格式会报错,json数据类型默认值不允许为空。
优势:
  1. 存储上类似text,可以存非常大的数据。
  2. JSON有效性检查:插入的数据必须是JSON类型的字符串才行。
  3. 相比于传统形式,不需要遍历所有字符串才能找到数据。
  4. 支持索引:通过虚拟列的功能可以对JSON中部分的数据进行索引
参考:https://blog.csdn.net/u011207...
75. Mysql索引创建原则
  1. 最适合索引的列是出现在 where 子句或连接子句中的列,而不是出现在 select 的关键字后的列
  2. 索引列的基数越大,索引效果越好
  3. 对字符串进行索引,应指定一个前缀长度,可以节省大量的索引空间
  4. 根据情况创建复合索引,复合索引可以提高查询效率
  5. 避免创建过多索引,索引会额外占用磁盘空间,减低写操作效率
  6. 主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用,提高效率
76. 索引的注意事项
  1. 复合索引遵循左前缀原则
  2. like 查询,%不能在前,可以使用全文索引
  3. column is null 可以使用索引
  4. 如果 MySQL 估计使用索引比全表扫描更慢,会放弃使用索引
77.查询速度慢的原因
  1. 打开慢查询日志,通过 pt-query-dugest 分析
    #看一下当前mysql数据库是否开启了慢查询 show variables like 'slow_query%'; #临时开启 set global slow_query_log='ON';

    永久开启:修改配置文件my.cnf,在[mysqld]下的下方加入
    [mysqld]
    slow_query_log = ON
    slow_query_log_file = /var/lib/mysql/tmp_slow.log //linux
    long_query_time = 1
    重启mysql服务
  2. show profile,通过 set profiling=1; 开启,服务器上执行的所有语句消耗时间都会记录到临时表。show profile for query QUERY_ID 查询指定查询
  3. show status,查询一些计数器,猜出哪些代价高或消耗时间多
  4. show processlist,查询线程状态进行分析
  5. explain,分析单个 SQL 语句查询
78.Mysql优化查询过程中的数据访问
  1. 访问数据太多导致性能下降
  2. 确定应用程序是否检索大量超过需要的数据,可能是太多列或者行
  3. 确定 mysql 是否分析大量不必要的数据行
  4. 查询不需要的记录,使用 limit 限制
  5. 夺标关联返回全部列指定 A.id,A.name
  6. 总数取出全部列,select * 会让优化器无法完成所有覆盖扫码的优化
  7. 重复查询相同的数据,可以缓存数据
  8. 改变数据库和表的结构,修改数据表范式
  9. 重写 SQL 语句,让优化器可以更优的执行
79.优化长难的查询语句
  1. MySQL 内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
  2. 将一个大的查询分解为多个小的查询
  3. 分解关联查询,将一个关联查询分解为多个 sql 来执行,让缓存效率更高,执行单个查询可以减少锁的竞争,在应用层做关联可以更容易对数据库进行拆分,查询效率会有大幅提升,较少冗余记录的查询
80 .优化特定类型的查询语句
  1. 优化 count()查询,count(*)会忽略所有列,直接统计所有列数,因此不要用 count(列名)
  2. 优化关联查询,确定 ON 或者 USING 子句的列上有索引;确保 GROUP BY 和 ORDER BY 中只有一个表的列,这样 MySQL 才有可能使用索引
  3. 优化子查询,可使用关联查询替代
  4. 优化 GROUP BY 和 DISTINCT,建立索引进行优化
  5. 优化 LIMIT 分页,可以通过记录上次查询的最大 ID,如果根据 id 排序时,下次查询根据该 ID 来查 询(如:ID > maxID)
  6. 优化 UNION 查询,UNION ALL 性能比 UNION 高
81.高并发常见单位
  1. QPS:每秒钟请求或查询数量,在互联网领域指每秒响应的请求数(指 HTTP 请求)
  2. 吞吐量:单位时间内处理的请求数量(通常由 QPS 和并发数决定)
  3. 响应时间:从请求发出到收到响应花费时间
  4. PV:综合浏览量(Page View),即页面浏览量或者点击量,一个访客在 24 小时内访问的页面数量。同一个人浏览你的网站同一个页面,只记作一次 PV
  5. UV:独立访客(UniQue Visitor),即一定时间范围内相同访客多次访问网站,只能计算
为 1 个独立访客
  1. 带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小
  2. 日网站带宽=PV/统计时间(秒)平均页面大小(KB)8
  3. 峰值一般是平均值的倍数
  4. QPS 不等于并发并发连接数。QPS 是每秒 HTTP 请求数量,并发连接数是系统同时处理的请求数量
  5. 二八定律(80%的访问量集中在 20%的时间):(总 PV 数 80%)/(6 小时秒速 20%)=峰值每秒请求数(QPS)
  6. 压力测试:能承受最大的并发数和最大承受的 QPS 值
82.常用性能测试工具 ab
# 模拟并发请求 100 次,总请求 5000 次 ab -c 100 -n 5000 http://example.com

83.http 状态码
  1. 200 请求成功2. 204 not content
  2. 206 reset content
  3. 301 永久重定向
  4. 302 临时重定向
  5. 307 临时重定向
  6. 400 错误请求
  7. 401 缺少认证信息
  8. 403 拒绝
  9. 404 不存在
  10. 500 服务器异常
  11. 502 Bad Gateway
  12. 503 服务器超负载或停机维护
84.OSI 七层协议
物数网传会表应
  1. 物理层:建立、维护、断开物理连接
  2. 数据链路层:建立逻辑连接,进行硬件地址寻址,差错校验等功能
  3. 网络层:进行逻辑地址寻址,不同网络之间的路径选择
  4. 传输层:定义传输数据的协议端口号,一级流控和差错校验。协议有 TCP/UDP,数据包一旦离开网卡即进入网络传输层
  5. 会话层:建立、管理、终止会话
  6. 表示层:数据的表示、安全、压缩
  7. 应用层:网络服务与用户的 接口,默认协议有 :http(80),ftp(21),tftp,smtp(25),snmp,dns(53),telnet(23),https(443),pop3(110),dhcp
85. HTTP 协议常见请求头/响应头
  1. Content-Type 指定数据内容类型
  2. Accept 指定客户端能接受数据内容类型
  3. Origin 最初请求来源(POST)
  4. Cookie
  5. Cache-Control 指定请求的缓存机制
  6. User-Agent 用户浏览器信息
  7. Referrer 上级请求路径
  8. X-Forwarded-For 请求端真实 ip
  9. Access-Control-Allow-Origin 允许其他请求域名,用于跨域
  10. Last-Modified 最后响应时间

    推荐阅读