PHP7源码笔记一

简介:

1.builtin types

基本定义在Zend/zend_types.h和Zend/zend.h中
主要的几种:

  • 原始类型:zend_bool,zend_uchar,zend_intptr_t..
  • 封装的用户直接接触的类型
    zend_string,zend_array(HashTable),zend_object,zend_resource,zend_function..
  • 内部使用:
    zval,zend_value,zend_class_entry,zend_reference,zend_refcounted,zend_ast,zend_ast_ref,Bucket,zend_execute_data,HashTableIterator..

基本上是围绕以上几种类型构建整个数据操作的,尤其是
zend_object,HashTable,zend_string,zval的操作很常用


2.a couple of important globals

整个PHP环境和Zend环境会涉及多个全局变量,下面是几个比较重要的:

  • php_core_globals core_globals(main/php_globals.h) ==> PG PHP调度sapi和zend engine的整个环境的全局变量存放位置
  • sapi_globals_struct sapi_globals(main/SAPI.c) ==> SG SAPI模块的环境变量,主要是包括每次PHP请求的数据
  • zend_compiler_globals compiler_globals(Zend/zend_compile.c) ==> CG Zend engine 编译过程需要的全局变量
  • zend_executor_globals executor_globals(Zend/zend_compile.c) ==> EG Zend engine 执行过程中需要的全局变量
  • zend_alloc_globals alloc_globals(Zend/zend_alloc.c) ==> AG Zend engine memory management globals
  • zend_gc_globals gc_globals(Zend/zend_gc.c) ==> GC_G Zend engine gc related globals
  • module globals(用Zend/zend_API.h中的DECLARE宏定义在相应模块中) ==> PHP扩展模块的全局变量

以上几个全局变量基本是从PHP环境到SAPI环境到Zend engine编译执行以及我们写自己的扩展时会涉及到的。


3.sapi

sapi模块主要是提供一套外界使用zend engine的统一接口,提供不同的服务模式,比如典型的几个模式:

  • cli
  • cgi
  • apache module

不同的服务模式在模块的初始化,请求的初始化不太相同,对于服务类的通常只需要初始化一次sapi模块,sapi_startup–>sapi_module.startup
包括上述全局变量/PHP扩展模块初始化/Zend扩展的初始化等,之后只需要针对每次请求调用php_request_startup,zend_activate,sapi_activate,来激活request,sapi,zend engine,重新设置请求的数据,响应请求。


4.startup process

基本调用流程:
//初次调用流程

  • sapi_startup(&sapi_module)
  • sapi_module.startup()
    • php_module_startup()
    • sapi_activate()
    • gc_global_ctor()
    • zend_startup()
      • zend_mm_startup()
    • sapi_deactivate()

//请求流程

  • php_request_startup()
    • zend_activate()
    • init_gc()
    • init_compiler()
    • init_executor()
    • sapi_activate()
  • php_request_shutdown()
    • zend_deactivate()
    • sapi_deactivate()
    • or full zend_memory_shutdown
    • or sapi_module.shutdown

5.memory manager

(1)内存管理相关的重要数据结构

  • zend_mm_heap
  • zemd_mm_storage
  • zend_mm_chunck
  • zend_mm_page
  • zend_mm_page_map
  • zend_mm_bin
  • zend_arena
  • zend_mm_huge_list
  • zend_mm_free_slot

(2)sapi模块第一次初始化时:

  • zend_mm_startup
    • alloc_globals_ctor
    • zend_mm_init初始化zend_mm_heap,分配main_chunck,并初始化main_chunck中的zend_mm_heap结构体,
      main_chunck负责存储相关信息,只有main_chunck使用了heap结构体,并将heap与AG(mm_heap)挂接

(3)每次请求init_compiler时分配zend_memory_arena

  • init_compiler
    • zend_arena_create(64M) 放入CG(arena)
    • emalloc
    • _emalloc
      • zend_mm_alloc_heap(AG(mm_heap)…)
      • < 3072字节 zend_mm_alloc_small
        • 根据size计算free_slots中是否还有空的小块item,如果有直接返回指针,否则zend_mm_alloc_small_slow
        • zend_mm_alloc_pages根据bin_pages数组得到需要分配的页面,
          如果空闲页面不足则重新zend_mm_chunck_alloc(mmap)分配chunck
      • < 2M-4096字节 zend_mm_alloc_large
        • 直接使用zend_mm_alloc_pages分配
      • zend_mm_alloc_huge
        • 使用zend_mm_chunck_alloc,加入heap的hugeblock_list

6.compiler and executor

(1)编译接口及编译流程:

  • zend_eval_string(zend_execute_API.c)
    • zend_eval_stringl
    • zend_compile_string(zend_compile.c)
      • compile_string(zend_language_scanner.c)
      • zendparse(就是yyparse)(zend_language_parse.y) ==> 通过parser调用lexer,生成抽象语法树ast_list,存到CG(ast)
      • zend_compile_top_stmt ==> 编译ast生成oparray
      • pass_two(oparray) ==> 优化?

(2)执行流程

  • zend_execute(zend_vm_execute.h)
    • zend_vm_stack_push_call_frame
    • i_init_execute_data
    • zend_execute_ex
    • execute_ex(zend_vm_execute.h)
    • zend_vm_stack_free_call_frame

后续部分:gc/php modules and zend extensions/grammar/ast/thread safety

ref:php-src

相关文章
|
19天前
|
JavaScript PHP 数据安全/隐私保护
乞丐在线要饭系统PHP网站源码
在这个物欲横流、竞争激烈的时代,有时候我们真心觉得钱来得太不容易,甚至连最基本的生存都成了负担。于是,我们想出了一个特别“独特”的点子:用利息砸我,给我点施舍!
48 1
|
1月前
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
1月前
|
前端开发 JavaScript PHP
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
|
2月前
|
PHP
PHP全自动采集在线高清壁纸网站源码
PHP全自动采集在线高清壁纸网站源码,PHP全自动采集在线高清壁纸网站源码,一款开源壁纸源码,无需安装。集合360壁纸,百度壁纸,必应壁纸,简单方便。每天自动采集,自动更新,非常不错,php源码 网站源码 免费源码 自动采集。
56 3
|
2月前
|
PHP 数据库
2024表白墙PHP网站源码
2024表白墙PHP网站源码
43 1
|
3月前
|
安全 BI PHP
php前后端分离,仓储模式r的医院不良事件上报系统源码
此医院安全不良事件管理系统采用前后端分离架构(PHP+Laravel8+Vue2+Element),实现事件上报至解决的全流程管理。系统支持结构化上报、数据自动引用、智能流程及预警,配备质控分析工具生成各类报表。通过PDCA闭环管理,确保事件得到有效处置并预防再发,同时提供便捷上报通道,优化上报效率。
php前后端分离,仓储模式r的医院不良事件上报系统源码
|
3月前
|
前端开发 关系型数据库 MySQL
最新黑名单查询录入系统PHP网站源码
最新黑名单查询录入系统PHP网站源码 前端html 后端layui 操作部分都采用API接口的方式实线 集结了layui表格的多数据操作,添加,批量删除,分页,单项删除 后台数据修改采用绑定参数的形式来进行修改可以很好的预防数据库注入,当然如果你想要测试这个防注入的你也可以尝试一下 PHP版本70+ 数据库Mysql 5.6 上传程序访问 http://你的域名/install 安装
98 0
|
4月前
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
68 3
|
4月前
|
小程序 PHP
全新UI自助图文打印系统小程序源码 PHP后端 附教程
全新UI自助图文打印系统小程序源码 PHP后端 附教程
274 2
|
4月前
|
移动开发 前端开发 应用服务中间件
挂售转卖竞拍商城系统源码/竞拍系统/转拍闪拍系统/后端PHP+前端UNiapp源码
挂售转卖竞拍商城系统源码/竞拍系统/转拍闪拍系统/后端PHP+前端UNiapp源码 亲测可用
126 1