я бы хотел 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.
Я уже исправил это сам. Хитрость заключалась в том, чтобы создать исключение внутри кода 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.
Других решений пока нет …