2021年php常见核心面试问题有???

01

每日很冒险的梦

Wo - 公号「八点半技术站」的创作者 - Bruce.D (姓氏:豆)。

今日主题(带着问题去学习):

  • php - GC机制  ???

  • __autoload的理解 有什么缺点 ???

  • php 生命周期 ???

  • hash表实现方式 ???

此篇文章干到凌晨2点、文章底部会有【福利社群】,欢迎来撩~~~

02

解决你很冒险的梦

问题一:

        php - GC机制  ???

说的通俗一点哈:百分百有伙伴会问,gc 是什么?gc 呢是 php 的 垃圾回收机制,这么说你是不是有助于你接下来的浏览,不然都不知道是啥,然后一顿猛浏览~~~

就像面试官紧接着问你:php中垃圾是如何定义的?

准确地说,判断是否为垃圾,主要看有没有变量名指向变量容器zval,如果没有则认为是垃圾,需要释放。小嘴这么一回答,岂不美哉哉。

面试问到你 GC 机制,其实你就必须务必想明白 3个点。第一个:gc的原理(垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。),如果这个简单原理说不上来,emmm....那你这个问题回答也就够呛。

其次,第二个:gc 的垃圾如何产生的(复杂类型,像字符串、数组、对象等的数据结构中,头部都有一个 gc, 这个 gc 的作用就是用来对垃圾回收的支持。),这个你也需大概明白,至少证明你学习过,对的吧,让你的回答看起来更加完整一些。

最后,第三个:gc 的回收过程(当变量赋值、传递时,会增加 value 的引用数, unset、return 等释放变量时再减掉引用数,减掉后如果发现 refcount 变为 0 则直接释放 value,这是变量的基本回收过程。)。

哪怕过程你只是知道如何回收,至少让面试官对你印象又加分了吧。说实在的,你突然问一个技术这个gc 的这些问题,他未必也能回答上来。看完这个你可以问问你周边 or 公司的技术,让他们回答。

知识点:
.unset只是断开一个变量到一块内存区域的连接,同时将该内存区域的引用计数-1;内存是否回收主要还是看refount是否到0了,以及gc算法判断

php.ini中设置 zend.enable_gc 项来开启或则关闭GC。

gc_enable() : 开启GC gc_disable() : 关闭GC
gc_collect_cycles() : 在节点缓冲区未满的情况下强制执行垃圾分析算法


问题二:

        __autoload的理解 有什么缺点 ???

当面试管问你:php自动加载为什么autoload被抛弃了 ? 你是不是一听啥玩意?怎么就抛弃了,之前还用这 __autoload 加载一次,怎么现在就......

来,让 bruce.d 为你解答,这个问题正好我还记得。

spl_autoload_register  和 __autoload 都是PHP自动加载的两种方式。这个大家是知道的吧~~~   自从 spl_autoload_register 出现后,已经逐渐替代了 __autoload。虽然二者实现的最终功能一样,但是不同的是 spl_autoload_register 可以注册多种加载机制。而__autoload只可以定义一次。

比如,现在需要加载目录A和目录B内的类,A目录中定义所有文件名和类名一致,B目录下的文件名和类名也一样,但是会多一个和类名一样的目录,比如类MapA,存放在目录b/MapA/MapA.php,那么A和B注册加载机制不一样,如果用__autoload就需要多从判断,而spl_autoload_register分开写两种注册机制,都进行注册就好了。其实只是spl_autoload_register比__autoload更灵活而已。

来上代码:

function load1($className){echo 1;if (is_file($className . '.php')) {require $className . '.php';    }}function load2($className){echo 2;if (is_file('./app/' . $className . '.php')) {require './app/' . $className . '.php';    }}
//注册了2个spl_autoload_register('load1');spl_autoload_register('load2');$db = new DB(); $info = new Info();

问题三:

        php 生命周期 ???

问到这个,我感觉你别说回答上来的人不是大佬,还真不行呢,不信你试试呗。

当初别人问我,反正我也一脸懵逼,感觉生命周期抛弃了我,哈哈哈。我个人建议,当问到你这个的时候,你首先肯定知道他的一个周期阶段运转,对吧。

我这里会闲科普你一个点,就是你说完执行阶段,不管面试管问你 还是你们互动,你可以接着讲,让他无话可讲~~~

php的运行模式有两种:web模式和cli模式。无论是哪种公众模式,php的工作原理都是一样的,都是作为一种SAPI运行。首先,认识下SAPI,它是什么?

Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

常见的SAPI有cli、cgi、php-fpm以及各服务具体的sapi。

生命周期运行PHP都经过下面几个阶段:

1、模块初始化阶段(module init):
这个阶段主要进行php框架、zend引擎的初始化操作。这个阶段一般是在SAPI启动时执行一次,对于FPM而言,就是在fpm的master进行启动时执行的。php加载每个扩展的代码并调用其模块初始化例程(MINIT),进行一些模块所需变量的申请,内存分配等。

2、请求初始化阶段(request init):
当一个页面请求发生时,在请求处理前都会经历的一个阶段。对于fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个阶段。在这个阶段内,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量。

3、php脚本执行阶段
php代码解析执行的过程。Zend引擎接管控制权,将php脚本代码编译成opcodes并顺次执行

4、请求结束阶段(request shutdown):
请求处理完后就进入了结束阶段,PHP就会启动清理程序。这个阶段,将flush输出内容、发送http响应内容等,然后它会按顺序调用各个模块的RSHUTDOWN方法。RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。

5、模块关闭阶段(module shutdown):
该阶段在SAPI关闭时执行,与模块初始化阶段对应,这个阶段主要是进行资源的清理、php各模块的关闭操作,同时,将回调各扩展的module shutdown钩子函数。这是发生在所有请求都已经结束之后,例如关闭fpm的操作。(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)


这里其实你就记住阶段即可,我给你扩展是为了让你更加能说哈~~~

毕竟你说出这些,他认为你了解研究过,不然不可能回答出来,别不信,拿你同事去试试。

问题四:

        hash表实现方式 ???

这个就留着给你自己扩展学习了,看你自己驱动力了。因为让你学习哪怕你不去实践,至少你浏览知道有这么一个东西,对吧,这样总比大脑一片空白强好多呢。

分割线

恭喜你、又读完了一篇文章,有什么建议 & 反馈,留言区见。同时,为了方便大家学习、交流、接活、分享技术干货,可以扫下面二维码 ,备注 “技术” 就可以通过审核。

进群的小伙伴请加右侧私人微信(备注:技术进群)

-----商务合作分隔线----

商务合作,关注公众号回复“商务合作”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八点半的Bruce丶D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值