预编译PHP文件

时间:2018-08-25 20:29:40

标签: php c php-extension php-internals

作为一项学习练习,我试图保存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会关心它的值!?

0 个答案:

没有答案