• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP后端面试85问

php 搞java代码 3年前 (2022-08-01) 54次浏览 已收录 0个评论

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援用传值后果

<?php
$a=[1,2,3]; 
foreach($a as &$v){} //$v 依然援用到最初一项 $a[2]
foreach($a as $v){}  //$a[2]会遍历$a中的值,$v=1,$v=2,$v=2
echo json_encode($a);//[1,2,2]

参考: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环状援用内存透露

<?php
$a = array( 'one' );
$a[] = &$a;
xdebug_debug_zval( 'a' );//a:(refcount=2, is_ref=1),
?>

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攻打及防御机制

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 3

uniq -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://www.gaodaima.com/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 作为序列号。

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():指定地位把字符串的一部分替换为另一个字符串

<code class="php"><?php
echo substr_replace("Hello","world",0); //输入 world
// 0 will start replacing at the first character in the string

50.简述TCP和UDP协定

TCP:传输控制协议

UDP:用户数据报协定

1、udp是无连贯的,tcp是面向连贯的;

2、udp是不牢靠传输,tcp是牢靠传输;

3、udp是面向报文传输,tcp是面向字节流传输。

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的单例模式利用场景

单次页面级申请,呈现多个利用场景并须要共享同一对象资源时。

比方数据库操作类、网络申请类、日志操作类、配置管理服务等等。

<code class="php">class Singleton
{
    private static $uniqueInstance;
    private $singletonData = '单例类外部数据';
    private function __construct()
    {
        // 构造方法私有化,内部不能间接实例化这个类
    }
    public static function GetInstance()
    {
        if (self::$uniqueInstance == null) {
            self::$uniqueInstance = new Singleton();
        }
        return self::$uniqueInstance;
    }
    public function SingletonOperation(){
        $this->singletonData = '批改单例类外部数据';
    }
    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.正则匹配符


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://www.gaodaima.com/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 剖析

    <code class="mysql">#看一下以后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 最初响应工夫

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP后端面试85问

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址