乐趣区

关于php: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 援用传值后果

<?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://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 作为序列号。

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

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

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

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

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://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 最初响应工夫
退出移动版