【精选】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. 面向对象基本原则?

  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. 设计模式分类,设计原则

创建型模式、结构型模式、行为模式

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.局部变量和静态局部变量,全局变量和静态全局变量的区别?

把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。

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

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的执行过程?

  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

  • 叶子结点不存储指针。

9f8ed99b2e7c71b61447b385d5d0cf52.jpeg

posted @ 2022-10-20 23:41  码农编程进阶笔记  阅读(21)  评论(0编辑  收藏  举报
返回顶部 有事您Q我