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