【精选】Mysql B-Tree和B+Tree的结构?

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. 面向对象基本原则?
单一职责原则SRP(Single Responsibility Principle) :是指一个类的功能要单一,不能包罗万象。

开放封闭原则OCP(Open-Close Principle) 一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。

替换原则(the Liskov Substitution Principle LSP) :子类应当可以替换父类并出现在父类能够出现的任何地方。

依赖倒置原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。

接口分离原则(the Interface Segregation Principle ISP) 模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。

5. 设计模式分类,设计原则
创建型模式、结构型模式、行为模式

创建型模式,就是创建对象的模式,抽象了实例化的过程。

简单工厂模式(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请求的流程
浏览器发送URL请求

DNS解析域名

获取到IP后开始访问IP和Port

开发发送TCP请求到Nginx

Nginx解析server name ,然后发送到 php-fpm管理进程

php-fpm把具体的请求交给PHP执行

7. PHP静态变量有几种?
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元)。

静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。

静态变量的值可变,但不会随着函数的调用和退出而发生变化。

静态局部变量:static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。

静态变量的初始值为0。

静态全局变量:全局变量(外部变量)的声明之前再冠以static 就构成了静态的全局变量。

7.局部变量和静态局部变量,全局变量和静态全局变量的区别?
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。

把全局变量改变为静态变量后是改变了它的作用域(静态全局变量只在定义该变量的源文件内有效),限制了它的使用范围。

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]
11.PHP的执行过程?
扫描(scanning) :将index.php内容变成一个个语言片段(token)

解析(parsing) :将一个个语言片段变成有意义的表达式

编译(complication):将表达式编译成中间码(opcode)

执行(execution):将中间码一条一条的执行

输出(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,强制回收缓冲区中的垃圾。

如果一个引用计数refcount增加,它将继续被使用,当然就不再在垃圾中。

如果引用计数refcount减少到0,所在变量容器将被清除(free),不会进入缓冲区。

仅仅在引用计数减少到非零值时,才会产生垃圾周期(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攻击攻击原理及过程如下:

用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

浏览器在接收到这些攻击性代码后,根据网站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:

d>=2,即B-Tree的度(对于一个节点,有n个边和它相连,就叫做度数=n);

h为B-Tree的高;

每个非叶子结点由n-1个key和n个指针组成,其中d<=n<=2d;

每个叶子结点至少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶结点的指针均为NULL;

所有叶结点都在同一层,深度等于树高h;

key和指针相互间隔,结点两端是指针;

一个结点中的key从左至右递增排列;

一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key,其查找结点个数的渐进复杂度为O(logdN)

B+Tree:

每个结点的指针上限为2d而不是2d+1(指针个数和 key的个数相同)。

非叶子结点不存储data,只存储key;

叶子结点不存储指针。

作者:码农编程进阶笔记


欢迎关注微信公众号 :码农编程进阶笔记