Skip to content

php opcode to handler

Posted on:May 8, 2020 at 02:01 PM

php 的opcode 对应很多的handler

选哪个handler 是怎么选择的呢?

和tcp协议一个连接 是一个五元组一样

php的opcode 的handler 是一个三元组 分别是 opcode , op1 , op2

核心函数

ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)
{
	zend_uchar opcode = zend_user_opcodes[op->opcode];

    ...
    // zend_opcode_handlers 是什么呢?  是一堆函数指针的数组 ,每个opcode + op1+ op2 决定一个 函数指针
	op->handler = zend_opcode_handlers[zend_vm_get_opcode_handler_idx(zend_spec_handlers[opcode], op)];
}

所以核心的核心就是

zend_vm_get_opcode_handler_idx(zend_spec_handlers[opcode], op)

他做了什么呢? 其实就是算出zend_opcode_handlers这个函数指针数组的偏移值