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

ebu*_*udi 25 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程序终止后访问操作码.

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

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

Tim*_*ner 1

您可以使用parsekit可从pecl 网站pecl下载或安装的工具:

sudo pecl install parsekit
Run Code Online (Sandbox Code Playgroud)

在运行时从 PHP 代码字符串中获取操作码:

你可以使用parsekit_compile_string

该命令的语法是:

array parsekit_compile_string ( string $phpcode [, array &$errors [, int $options = PARSEKIT_QUIET ]] )
Run Code Online (Sandbox Code Playgroud)

参数:

php代码

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

错误

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

选项

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

返回值

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

其用法示例如下:

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

  var_dump($ops);
?>
Run Code Online (Sandbox Code Playgroud)

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


在运行时从 PHP 文件获取操作码:

你可以使用parsekit_compile_file

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