Подтвердить что ты не робот

Получить PHP-коды динамически во время выполнения

Я хочу создать расширение PHP, которое может динамически проверять каждый код операции, сгенерированный из файла PHP, и делать некоторые проверки на это.

Я наткнулся на несколько веб-сайтов и обнаружил пару таких функций, как zend_set_user_opcode_handler, но я не понимаю, как эту функцию можно использовать для получения полного кода операции, например ASSIGN !0, 50.

Мне известна команда типа php -d vld.active=1 -d vld.execute=0 -f [filename].php, которую я могу использовать для генерации PHP-кодов операций, но насколько я знаю, вы можете получить доступ только к кодам операций после завершения программы PHP.

То, что я хотел бы получить от расширения, - это код операции, который получается один за другим (динамически) по мере выполнения функции.

Может кто-нибудь помочь мне с этой проблемой?

4b9b3361

Ответ 1

Вы можете использовать parsekit, который доступен через pecl, который можно загрузить с сайт pecl или установлен с помощью:

sudo pecl install parsekit

Получите OPcodes из строки кода PHP во время выполнения:

Вы можете использовать parsekit_compile_string

Синтаксис для этой команды:

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

Параметры:

phpcode

Строка, содержащая phpcode. Подобно аргументу eval().

Ошибки

2D-хэш ошибок (включая фатальные ошибки), встречающиеся во время компиляции. Возврат по ссылке.

Параметры

Один из PARSEKIT_QUIET или PARSEKIT_SIMPLE. Для получения переменной степени детализации возвращаемого результата.

Возвращаемые значения

Возвращает сложную многоуровневую структуру массива, как описано ниже.

Пример использования этого параметра:

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

  var_dump($ops);
?>

Выход слишком длинный для включения в этот ответ, но доступен на странице


Получить OPcodes из файла PHP во время выполнения:

Вы можете использовать parsekit_compile_file

Очень похож на описанный выше подход, но анализирует файл вместо строки.