Zend Framework — Динамическое получение кодов операций 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.

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

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

25

Решение

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

sudo pecl install parsekit

Вы могли бы использовать 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);
?>

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


Вы могли бы использовать parsekit_compile_file

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]