TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.4 KiB
2.4 KiB
扩展模块生成
genExtension() 是流水线里最大的一块生成逻辑,产出 extension-<target>.cc——一个标准 Zend 扩展模块。它把前面收集的所有类、函数、常量、全局变量缝合进 Zend 的生命周期钩子(MINIT / MINIT / RINIT / RSHUTDOWN)。
Sources: src/Translator.php
生成结构
flowchart TD
A["extension-<target>.cc"] --> B["全局变量 / 类表 / 函数表 / 属性表 声明"]
B --> C["php_get_class / php_get_func / php_get_method / php_get_prop"]
C --> D["ext_functions[] (ZEND_FE 列表)"]
D --> E["PHP_MINIT: 注册类/反射处理器/符号"]
E --> F["PHP_RINIT: php_app_init + eval(main)"]
F --> G["PHP_RSHUTDOWN: php_app_clean + request_shutdown"]
G --> H["zend_module_entry"]
Sources: src/Translator.php
关键片段
- 符号解析函数:
php_get_class/php_get_func/php_get_method/php_get_prop用缓存的class_map/func_map/prop_map把字符串名映射到运行时zend_class_entry*/zend_function*,带UNEXPECTED快路径。 - MINIT:安装 Fiber/Generator 类、反射属性处理器,逐个注册类并设置属性处理器;最后调用各
registerSymbols函数。 - RINIT:
php_app_init()注册常量、全局变量、静态属性、类数组常量;bin模式下php::eval执行main()(按$argc/$argv或空参两种签名)。 - RSHUTDOWN:
php_app_clean()清理全局变量、VAR 常量、类数组常量(含继承来的数组常量),ext模式额外清空三张映射表以支持模块重载。
Sources: src/Translator.php · src/Translator.php
模式差异
bin:嵌入cli_set_process_title,RINIT直接跑main();lib:Linux 下导出save_ps_args占位符;getModuleName()仍生成模块入口;ext:用ZEND_GET_MODULE(),跳过main(),RSHUTDOWN 清空映射表。
Sources: src/Translator.php · src/Translator.php