Выход из функции, которая вызывает eval изнутри eval

я бы хотел eval() чтобы сделать функцию, которая вызывает его, чтобы закончить, а также. Но я не хочу останавливать все приложение.

Я использую include для включения стороннего приложения в мое собственное приложение. Стороннее приложение в конце концов вызывает функцию, которая сначала позволяет мне вводить код через ловушку, заканчивать, а затем в конце функции, которую она просто вызывает exit();,

Я не хочу редактировать их код вручную. И я также не хочу включать стороннее приложение, использующее exec () или readfile () или curl (), или включать через http или любой другой подобный метод. Потому что я хочу, чтобы контекст клиента оставался существующим по отношению к стороннему скрипту. (В противном случае сторонний скрипт будет считать, что мой собственный сервер является клиентом. Например, сторонний скрипт всегда будет видеть, что $_SERVER['REMOTE_ADDR'] является 127.0.0.1, И я этого не хочу.)

Короче говоря, происходит следующее:

Мое заявление:

// do stuff
// ...
chdir("path/to/third/party/application");
include ("path/to/third/party/application/index.php");
chdir("path/to/my/application");
// ...
// do more stuff

Стороннее приложение:

// do some stuff
// ...
doLastStuff();

function doLastStuff() {
// doing some last stuff
// ...

$hook = "..."; // get code from database
if ($hook) {
eval($hook);
}
exit();
}

Проблема в том, что exit(); в конце также останавливается мой собственный сценарий. И я не хочу этого. Может кто-нибудь увидеть способ остановиться, чтобы избежать этого exit() остановить мой сценарий тоже изнутри крючка?

Я могу положить какую-нибудь строку в $ hook.

0

Решение

Я уже исправил это сам. Хитрость заключалась в том, чтобы создать исключение внутри кода eval’d. И включить включить в try / catch в моем собственном приложении.

Мое заявление:

// do stuff
// ...
chdir("path/to/third/party/application");
try {
include ("path/to/third/party/application/index.php");
}
catch (Exception $e) {
}
chdir("path/to/my/application");
// ...
// do more stuff

Стороннее приложение:

// do some stuff
// ...
doLastStuff();

function doLastStuff() {
// doing some last stuff
// ...

$hook = "throw new Exception();"; // get code from database

if ($hook) {
eval($hook);
}
exit(); // will no longer be executed...
}

Я также мог бы создать пользовательский класс Exception, так что я ловил только свое собственное Exception и оставлял другие исключения uncauted.

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector