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

时间: 2025-01-25 00:53:05

PHP7源码笔记一的相关文章

React Native 源码笔记——你知道几条?

ReactNative是Facebook开源的一种实现移动跨平台开发的解决方案,目前在业界得到广泛应用,这里有非常详细的中文使用指南.本文主要分享RN源码中一些值得大家学习或者借鉴的代码或者编写技巧等,供大家学习参考. 整个RN库包含10多个工程,有兴趣的童鞋可以下载源码查看具体细节,在此不再展开. 宏定义巧用 整个ReactNative源码工程中用到了大量的宏定义,包括RCT_EXTERN.RCT_NOT_IMPLEMENTED.RCT_EXPORT_METHOD以及RCT_EXPORT_MO

Yaf框架学习笔记之源码笔记

  从了解PHP不久就想着用扩展的方式来实现PHP的程序框架,后来了解鸟哥已经实现了yaf简单的C实现PHP的MVC框架,故将其源代码研究了好几遍.yaf的优势是简单,高效,高性能,框架长驻内存,程序配置内存化,其实主要是运行速度比大部分PHP的框架都快. 1.在内核扩展中加载PHP用户空间类文件 文件:yaf_loader.c 函数:int yaf_loader_import( char path, int len int use_path TSRMLS_DC) 行号:333 2.自动加载器

Activiti 流程启动及节点流转源码分析

作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文主要是以activiti-study中的xiaomage.xml流程图为例进行跟踪分析 具体的流程图如下: 流程图对应的XML文件如下: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MO

Laravel学习笔记之Middleware源码解析

说明:本文主要学习Laravel的Middleware的源码设计思想,并将学习心得分享出来,希望对别人有所帮助.Laravel学习笔记之Decorator Pattern已经聊过Laravel使用了Decorator Pattern来设计Middleware,看Laravel源码发现其巧妙用了Closure和PHP的一些数组函数来设计Middleware. 开发环境:Laravel5.3 + PHP7 + OS X 10.11 PHP内置函数array_reverse.array_reduce.

Laravel学习笔记之Container源码解析

说明:本文主要学习Laravel中Container的源码,主要学习Container的绑定和解析过程,和解析过程中的依赖解决.分享自己的研究心得,希望对别人有所帮助.实际上Container的绑定主要有三种方式:bind(),singleton(),instance(),且singleton()只是一种'shared' = true的bind(),这些已经在Laravel学习笔记之IoC Container实例化源码解析聊过,其实现方法并不复杂.当Service通过Service Provid

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1. 设置应用程序环境 define("ENVIRONMENT", "development"); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch

linux下mysql 5.1.73 源码安装笔记

linux下安装mysql有多种方式,相对而言源码安装速度最快,兼容性也会好些.相反,源码安装更麻烦一些. 第一步,下载和解压安装包: mysql 5.1.73官方下载地址. http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz md5:887f869bcc757957067b9198f707f32f 1 md5sum mysql-5.5.38.tar.gz      #计算md5校验和 2 tar -zxf mysql

Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme

原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上面的标题myFirstApp,怎么去掉这个标题呢?",当时我直接在AndroidMainfest.xml中添加了一个属性: android:theme="@android:style/Theme.NoTitleBar" 可能有的朋友就会迷惑了,为什么添加了这个属性就可以了.这一篇

Apache Spark源码走读(一)Spark论文阅读笔记&amp;Job提交与运行

<一>Spark论文阅读笔记 楔子 源码阅读是一件非常容易的事,也是一件非常难的事.容易的是代码就在那里,一打开就可以看到.难的是要通过代码明白作者当初为什么要这样设计,设计之初要解决的主要问题是什么. 在对Spark的源码进行具体的走读之前,如果想要快速对Spark的有一个整体性的认识,阅读Matei Zaharia做的Spark论文是一个非常不错的选择. 在阅读该论文的基础之上,再结合Spark作者在2012 Developer Meetup上做的演讲Introduction to Spa