我想构建一个PHP扩展,可以动态检查从PHP文件生成的每个操作码并对其进行一些检查。
我遇到了几个网站并发现了一些功能,例如zend_set_user_opcode_handler
,但我无法理解如何使用此功能来获取像ASSIGN !0, 50
这样的完整操作码。
我知道像php -d vld.active=1 -d vld.execute=0 -f [filename].php
这样的命令可以用来生成PHP操作码,但据我所知,你只能在PHP程序终止后访问操作码。
我希望从扩展程序获得的是一个操作码,它是在函数执行时逐个(动态地)获得的。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
您可以使用 pecl 提供的parsekit
,可以从pecl website下载或安装:
sudo pecl install parsekit
此命令的语法为:
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
上找到与上述方法非常相似,但解析文件而不是字符串。