当前位置: 首页 > 后端技术 > PHP

超话西施-PHP二三事

时间:2023-03-29 23:52:25 PHP

关键词:PHP架构,垃圾回收,数组底层实现,变结构zval,运行流程,fpm优化,PSR1-2内容,PHP多进程通信,laravel原理篇(容器,routing,queues,serviceprovider),swoolemulti-collaboration,SPL等1.PHPPHP从底层到PHP应用的基本结构是:zend_engine->zend(api/extension)->php(api/extension)->SAPI->applicationphp启动过程:模块初始化->请求初始化->词法分析->语法分析->中间代码生成->zend引擎分析中间代码,生成机器码->CPU执行->请求关闭->模块关闭2。垃圾收集PHP垃圾收集分为4个步骤,每个步骤都会用不同的颜色标记:1.将缓存中所有可能的链接标记为紫色2.执行模拟删除操作,这一步将ref_count大于的部分0-1,会得到两个结果,一个>0,一个=03。执行模拟恢复操作,这一步会恢复上一步中ref_count>0的部分4.执行删除3.数组的底层实现是哈希表。哈希表的内容存储在arData中。arData是一个数组。当需要存储新的键值对时,需要对键进行哈希处理,得到中间映射表。nIndex并存入arData数组的下标,依靠中间映射表完成hash查找,依靠arData完成顺序遍历。Hash冲突:arData主要是将key-value存储在buckets中,是一个链表结构。当有冲突时,新的key-value会直接加到head上,并连接到旧的链表上。查找的时候需要遍历链表。如果没有冲突,则在进行新的查找时,返回链表的头部。写入过程:写入时,直接插入到arData数组中。数组是连续的内存空间,直接追加,速度很快。之后会加上bucket的下标,根据n|TableMask得到一个nIndex,也就是中间的映射表所在的位置,存储bucket下标,nIndex和bucket的映射就完成了。扩容:当nNumUsed(nElements为有效元素)不够时,会扩容:新申请的空间将是旧nNumUsed的两倍,然后将数据从旧空间迁移到新空间。迁移完成后,旧空间将被清除。删除:桶中的元素会被标记为IS_UNDEF,即删除标记,等待扩容时自动删除。4.变量结构ZValzVal包含类型字段。PHP中的类型转换就是通过这个字段来完成的。类型字段包括IS_BOOLIS_DOUBLEIS_INTIS_NULL来标记它。在PHP7之前,zVal中的数据可能是一个指针。这个指针指向的变量可能还是一个指针,所以cpu计算的时候会从内存中获取,因为缓存区中没有变量的实际值,这样来回浪费了很多时间介于内存和CPU之间,而在PHP7中修改了zVal的数据结构,将val和zval放在一起,CPU执行时可以在缓存中读取,这也是php7比5.6快的原因之一.