作者:qiao203 | 来源:互联网 | 2022-12-06 16:57
作为一个学习练习,我试图保存php文件的编译状态,以便以后执行它而不必zend_compile_file
再次执行.
我做的第一件事是写一个钩子的扩展zend_compile_file
.如果请求是在未编译的文件(即:file.php)上进行的,则会将zend_op_array数据转储到另一个文件(即:compiled-file.php).如果请求是在这样的编译文件上进行的,它会将数据加载到新的zend_op_array中然后返回它.
为简单起见,我忽略了与类和函数相关的所有内容,因此我不希望我的扩展适用于包含这些内容的脚本.但我认为其他更简单的脚本应该可行吗?
好吧,它适用于非常简单的脚本,但通常它只是挂起并达到最大执行时间限制.我发现它总是在错误的条件分支上失败.例如,这个脚本可以工作:
虽然这个会挂起:
$a)
echo $a;
我的问题:我是否正确假设对于没有函数或类的简单脚本,制作zend_op_array的深层副本并返回它应该足以复制php编译?如果没有,我应采取的其他步骤是什么?
以下是我的扩展的相关文件:
opdumper.c
oploader.c
编辑:我设法通过更改此代码"修复"我的问题:
void dump_znode_op(FILE* fp, znode_op node, zend_uchar type)
{
fwrite(&type, sizeof(type), 1, fp);
switch(type) {
case IS_UNDEF:
case IS_UNUSED:
break;
...
}
}
到这一个:
void dump_znode_op(FILE* fp, znode_op node, zend_uchar type)
{
fwrite(&type, sizeof(type), 1, fp);
switch(type) {
case IS_UNDEF:
case IS_UNUSED:
fwrite(&(node.var), sizeof(node.var), 1, fp);
break;
...
}
}
(当然,对oploader.c应用类似的修复)
现在我只是更加困惑......为什么带有IS_UNUSED类型的znode_op关心它的值!