
内核探索---zend引擎
辛星
生命不息,奋斗不止。
展开
-
zend中的函数
在PHP中,函数分为俩种,一种是zend_internal_function, 这种函数是由扩展或者Zend/PHP内核提供的,用C/C++编写的,可以直接执行的函数。另外一种是zend_user_function, 这种函数呢,就是我们经常在见的,用户在PHP脚本中定义的函数,这种函数最终会被ZE翻译成opcode array来执行查看zend_compile.h,我们可以找到如转载 2016-01-11 21:21:09 · 572 阅读 · 0 评论 -
整理的一篇zend中的数组操作
数组的值存储在zvalue_value.ht字段中,ht是一个HashTable的数据在Zend/zend_vm_execute.h文件中static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS){ zend_op *opline = EX(opli原创 2016-03-18 16:58:49 · 1094 阅读 · 0 评论 -
转载一篇在扩展中声明类的文章
在这一节中,我们正式的定义一个类。首先我给出PHP语言的实现:[php] view plain copy print?class myclass { public $public_var; private $private_var; protected $protected_var;转载 2016-03-18 09:21:56 · 438 阅读 · 0 评论 -
转载的一篇php代码的执行流程
众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层-C语言,C语言更贴近人类熟悉的“自然语言”,程序设计者可以通过C语言编译转载 2016-03-18 00:20:02 · 459 阅读 · 0 评论 -
转载一篇opcode的文章
运行一段PHP代码主要有两个阶段:编译和执行, 当然编译过程中还包括词法分析语法分析不同阶段和细节,这里我们将其作为一个整体。在这两个阶段之间,PHP代码会被编译成op code,可以将其认为是引擎的一个中间语言,编辑阶段把PHP源码生成op code,然后在执行阶段执行这些op code。这篇文章将简单的介绍op code。 PHP代码编译之后会生成许多的op,每一个op都是一个z转载 2016-03-18 00:12:07 · 371 阅读 · 0 评论 -
转载的一篇不错的介绍篇opcode的handler的文章
1、opcode结构在Zend/zend_compile.h文件下123456789101112struct _zend_op { opcode_handler_t handler; znode_转载 2016-03-17 23:52:37 · 778 阅读 · 0 评论 -
对zend中变量的一些说明
实际上,在PHP中声明的变量,在ZE中都是用结构体zval来保存的。首先我们打开Zend/zend.h来看zval的定义:view plaintypedef struct _zval_struct zval;struct _zval_struct { /* Variable information */ zvalue_value value; /原创 2016-03-17 02:29:33 · 734 阅读 · 0 评论 -
对zend中变量的一些说明
在php中变量类型和值是通过c语言实现的,那php内核具体是怎么实现的呢?HashTable在php内核中广泛被使用,而变量就是存储在hashtable实现的符号表中.当在PHP中调用一个函数或者类时,内核会创建一个新的符号表,这也是为什么在函数中无法使用函数外部定义的变量的原因。(因为他们分属两个符号表,一个当前作用域,一个全局作用域)内核中作用域的定原创 2016-03-17 02:26:40 · 968 阅读 · 0 评论 -
zend中function的声明
phpfunction test(){ echo "abc";}test();?> 结论:一 编译 a.对 函数声明进行词法分析和语法分析:在语法分析中的函数zend_do_begin_function_declaration 作用是: 初始化zend_op_array,填充 function_name ,line_start ,设转载 2016-01-12 02:57:12 · 1195 阅读 · 0 评论 -
zend_execute中op的执行
解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h: ZEND_API void execute(zend_op_array *op_array TSRMLS_D转载 2016-01-12 00:17:30 · 747 阅读 · 0 评论 -
zend解析ini的流程(下)
1,运行时改变配置在前一篇中曾经谈到,ini_set函数可以在php执行的过程中,动态修改php的部分配置。注意,仅仅是部分,并非所有的配置都可以动态修改。关于ini配置的可修改性,参见:http://php.net/manual/zh/configuration.changes.modes.php我们直接进入ini_set的实现,函数虽然有点长,但是逻辑很清晰:PHP_FUNCT转载 2016-01-11 23:27:00 · 616 阅读 · 0 评论 -
zend解析ini的流程(上)
这篇文章不会详细叙述某个ini配置项的用途,这些在手册上已经讲解的面面俱到。我只是想从某个特定的角度去挖掘php的实现机制,会涉及到一些php内核方面的知识:-)使用php的同学都知道php.ini配置的生效会贯穿整个SAPI的生命周期。在一段php脚本的执行过程中,如果手动修改ini配置,是不会启作用的。此时如果无法重启apache或者nginx等,那么就只能显式的在php代码中调用ini_转载 2016-01-11 23:09:33 · 642 阅读 · 0 评论 -
zend函数中的参数的栈实现
首先说下今天想到的一个问题。在编写php扩展的时候,似乎参数(即传给zend_parse_parameters的变量)是不需要free的。举例:PHP_FUNCTION(test){ char* str; int str_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str转载 2016-01-11 22:55:11 · 619 阅读 · 1 评论 -
PHP7中内置的一些宏函数
EXCEPTED是经常使用到的一个,下面是它的定义:#if PHP_HAVE_BUILTIN_EXPECT# define EXPECTED(condition) __builtin_expect(!!(condition), 1)# define UNEXPECTED(condition) __builtin_expect(!!(condition), 0)#else# defi原创 2017-05-05 13:34:02 · 986 阅读 · 1 评论