源码家族
当前位置:首页 > 资讯中心

资讯中心

【 PHP底层知识你知道哪些 】

发布时间:2022-03-21 10:32:20 阅读次数:728

我这里主要是总结了必要学习的底层知识。考核的时候也是经常会被问起。除了考核,也是作为phper的你该要懂的。


一、如何理解php是弱类型语言

1.从变量角度:在声明一个变量不需要声明其类型,这事PHP的特色,因为他交给了底层。

底层的变量存储是在一个zval结构里,声明一个变量会把所有类型都考虑到并开辟空间,同种类型默认用最大限度声明(int用long,float用double),这样绝对满足的所有变量的需求。


2.从运算的角度:底层会根据你当前变量类型做转换并运算,并且返回结果做类型转换(string+string=int,float+string=float,sting('')==int0...);数组也可以加减参与运算;


详细的文章可以查看:你是如何理解php是弱类型语言的?

视频教程可查看:http://www.mano100.cn/thread-93-1-1.html


二、php生命周期

主要分为3个阶段,开始阶段,运行阶段,结束阶段

开始阶段:

1.module_init: 初始化全局变量,引入standard标准库,加载php.ini。

启动apache就经历一次;加了dll或.so扩展,php.ini发生改变,重启nginx或apache的原因;


2.request_init:对全局变量赋值,激活zend引擎。


运行阶段:

3.run:词法分析-语法分析-opcode

访问脚本,程序员们最熟悉的步骤了,你写的代码。


结束阶段:

4.request_shutdown:销毁使用的函数变量,回收内存

碰到die or exit自动进入此阶段并且调用析构方法 


5.module_shutdown:各模块最后一次释放内存


详细的文章教程可查看:咱们来看看PHP的工作原理与生命周期

视频教程可查看:http://www.mano100.cn/thread-93-1-1.html



三、变量的分离改变

变量8种类型:int ,string ,array, float ,bool, null ,resource ,object。


存储在zval_value(存储变量的值)zval_struct(存储变量的类型引用等)。


写时分离:PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的例程.【recount -=1】


写时改变:如果是一个引用的赋值,那会发生写实改变 【is_ref 由0->1】


详细的文章教程可查看:学习PHP底层就该学习PHP内核的存储机制

视频教程可查看:http://www.mano100.cn/thread-93-1-1.html



四、内存与垃圾回收

内存:

 1.内存是一次性申请:在sapi周期request_init,向系统申请内存,ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存, 建立一个类似于内存池的管理机制。


 2.用完后不释放:在sapi运行阶段,及时unset变量内存也不马上释放,而是归还heap堆层,将内存复用,避免多次内存申请和释放所带来性能消耗。


 3.统一释放:在sapi周期request_shutdown阶段,统一销毁释放内存。


 4.内存配置:在php.ini配置,memory_limit=32M


垃圾回收:

 1.php5.3以前,引用计数回收机制,变量都有recount的参数,当为0时判断无可用,回收。存在问题:内存泄漏怎么办?


 2.php5.3以后,引用计数的基础上,加入了一个复杂的垃圾回收算法(不用了解),每发生一次内存泄漏可能操作时,记录到【根缓冲区】,到了10000执行一次算法,清理这里边的垃圾。


 3.效果:复杂的算法固然会有时间消耗,增加了6~7%,但是产生的回收机制节约可98.3%的内存,利大于弊。


详细文章教程请查看:

学习PHP底层,探究内存管理与缓存机制

PHP内核分析:内存泄漏与新垃圾回收机制


视频教程可查看:http://www.mano100.cn/thread-93-1-1.html



五、命名空间

作用:定义了不同的空间,解决了类,函数等名字的冲突

本质:比较简单,php底层会将 命名空间与定义函数名以\结合的形式展现,不就不重名了嘛


上一篇:Laravel部署到线上需要注意的问题
下一篇:用php来搞定微信支付