在运行时动态获取 PHP 操作码在运行时从一串 PHP 代码中获取 OPcode:在运行时从 PHP 文件获取 OPcode:

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

我遇到了几个网站,发现了几个功能,如,但我不明白如何使用这个功能来获得一个完整的操作码,如.zend_set_user_opcode_handlerASSIGN !0, 50

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

我想从扩展中得到的是一个操作码,它是在函数执行时逐个(动态)获得的。

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


答案 1

您可以使用 parsekit,它可以通过它从 pecl 网站下载或安装:pecl

sudo pecl install parsekit

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

您可以使用parsekit_compile_string

此命令的语法为:

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

参数:

phpcode

包含 php 代码的字符串。类似于 eval() 的参数。

错误

编译期间遇到的错误(包括致命错误)的 2D 哈希。按引用返回。

选项

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

返回值

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

其用法示例如下:

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

  var_dump($ops);
?>

输出太长,无法包含在此答案中,但可在文档页面上找到


在运行时从 PHP 文件获取 OPcode:

您可以使用parsekit_compile_file

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


答案 2

推荐