在运行时动态获取PHP操作码

时间:2015-01-12 14:29:09

标签: php zend-framework php-extension php-internals

我想构建一个PHP扩展,可以动态检查从PHP文件生成的每个操作码并对其进行一些检查。

我遇到了几个网站并发现了一些功能,例如zend_set_user_opcode_handler,但我无法理解如何使用此功能来获取像ASSIGN !0, 50这样的完整操作码。

我知道像php -d vld.active=1 -d vld.execute=0 -f [filename].php这样的命令可以用来生成PHP操作码,但据我所知,你只能在PHP程序终止后访问操作码。

我希望从扩展程序获得的是一个操作码,它是在函数执行时逐个(动态地)获得的。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以使用 pecl 提供的parsekit,可以从pecl website下载或安装:

sudo pecl install parsekit

在运行时从一串PHP代码中获取OP代码:

您可以使用parsekit_compile_string

此命令的语法为:

array parsekit_compile_string ( string $phpcode [, array &$errors [, int $options = PARSEKIT_QUIET ]] )

参数:

  

phpcode

     

包含phpcode的字符串。与eval()的参数类似。

     

错误

     

编译期间遇到的错误的二维哈希(包括致命错误)。通过引用返回。

     

选项

     

PARSEKIT_QUIET或PARSEKIT_SIMPLE之一。在返回的输出中产生不同程度的冗长。

     

返回值

     

返回复杂的多层数组结构,如下所示。

此示例的用法是:

<?php
  $ops = parsekit_compile_string('
echo "Foo\n";
', $errors, PARSEKIT_QUIET);

  var_dump($ops);
?>

输出太长,无法包含在此答案中,但可以在documentation page

上找到

在运行时从PHP文件中获取OPcodes:

您可以使用parsekit_compile_file

与上述方法非常相似,但解析文件而不是字符串。