作为一项学习练习,我试图保存php文件的编译状态,以便稍后执行它,而不必再次经历frm
。
我做的第一件事是编写一个扩展钩子OpenFormInstance
。如果请求是在未编译的文件(即file.php)上进行的,则它将zend_op_array数据转储到另一个文件(即:compiled-file.php)。如果对这样的编译文件发出请求,它将把数据加载到新的zend_op_array中,然后将其返回。
为简单起见,我忽略了与类和函数有关的所有内容,因此我不希望自己的扩展程序可在包含那些内容的脚本上使用。但是我认为其他更简单的脚本也可以工作吗?
好吧,它可以在非常简单的脚本上运行,但通常会挂起并达到最大执行时间限制。我发现它总是在错误的条件分支上失败。例如,此脚本将起作用:
zend_compile_file
这只是挂起:
zend_compile_file
我的问题:对于没有函数或类的简单脚本,制作zend_op_array的深层副本并返回它足以复制php编译,是否正确?如果没有,我还应该采取什么其他步骤才能使其正常工作?
以下是我的扩展程序的相关文件: opdumper.c oploader.c
编辑:通过更改以下代码,我设法“解决”了问题:
<?php
$a = 10;
$b = 5;
if ($b < $a)
echo $a;
对此:
<?php
$a = 10;
$b = 5;
if ($b > $a)
echo $a;
(当然,还对oploader.c应用了类似的修复程序)
现在,我更加困惑了……为什么带有IS_UNUSED类型的znode_op会关心它的值!?