Skip to main content

php opcode to handler

· One min read

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这个函数指针数组的偏移值